Закрыть ... [X]

Как получить уже открытую форму документа

Как известно, любое современное приложение, разрабатываемое для конечных пользователей, содержит в себе различные средства интерактивного взаимодействия с программой, иначе говоря, интерфейс. Система "1С:Предприятие 8.0" предоставляет разработчикам широкий выбор объектов, позволяющих быстро создавать полный набор интерфейсных модулей: меню, панелей инструментов, всевозможных элементов управления. К ним также относятся формы, играющие ключевую роль в формировании удобного интерфейса пользователя. Конфигуратор поддерживает создание общих форм (доступных из любого объекта конфигурации), форм справочников, форм документов, форм для отчетов и обработок, форм для журналов документов и регистров, а также для некоторых других объектов, не рассматриваемых в данной книге.
Документы, как правило, всегда содержат несколько форм. На этапе разработки конфигурации предоставляется возможность задавать для каждого документа различные типы форм. Наиболее часто используются несколько определенных типов форм:

  • основная форма — позволяет пользователю создавать новый и корректировать существующий документ, заполнять реквизиты документа и табличных частей, сохранять документ в базе, проводить и отменять проводку;
  • форма работы со списком — специальная форма, позволяющая отображать список однотипных документов, в которой доступны различные средства поиска и отбора, сортировки, создания и удаления, ввода на основании (создание нового документа другого типа на основании выбранного из списка) и многое другое;
  • форма выбора — предоставляет возможность выбора из списка какого-либо документа с передачей по ссылке в другую форму.
Кроме перечисленных типов форм, имеется возможность создания пользовательских форм произвольного вида. В этом случае разработчик сам определяет предназначение и способы использования данных форм. Как правило, после формирования всех необходимых форм документа, одну из них назначают основной. Такая форма будет вызываться по умолчанию, если при вызове методов отображения не будет явно задан тип формы.
Здесь мы разберем приемы программирования только базовых и общих форм, но этого будет вполне достаточно для самостоятельной работы с любыми произвольными типами форм, поскольку для доступа и к тем и другим используются одни и те же базовые объекты: ДокументМенеджер, Документ Объект и ДокументСсылка.
В большинстве случаев, при разработке нового типа документа и создании для него различных форм, в качестве основной выбирают форму документа, которая содержит реквизиты и табличные части. Элементы управления, входящие в конфигуратор, позволяют в короткие сроки формировать удобный, красивый и функциональный интерфейс. Пример такого документа представлен на рис. 4.1.
Следует отметить, что большинство документов в системе "1С:Предприятие 8.0" имеют единый вид, что является примером грамотно продуманного интерфейса пользователя. Это дает возможность решить две наиболее важные задачи: удобство обучения и концентрация на самом процессе работы.
Для программного доступа к формам документа, как уже отмечалось ранее, служат несколько базовых объектов. Разберем их по порядку. Первый из них, ДокументМенеджер, предоставляет несколько удобных методов для получения объектов форм. С помощью метода ПолучитьФорму можно получить любую форму документа, заданную в конфигураторе на этапе проектирования. Посмотрите пример работы с данным методом, представленный в листинге 4.1.
Листинг 4.1. Получение форм документа_
// Получаем новую форму документа ФормаДокумента = Документы.ЗаказПокупателя.ПолучитьФорму("ФормаДокумента"); // Открываем полученную форму ФормаДокумента.Открыть(); // Получаем форму выбора ФормаВыбораДокумента = Документы.ЗаказПокупателя.ПолучитьФорму("ФормаВыбора"); // Проверяем, если форма уже открыта, просто активизируем ее Если ФормаВыбораДокумента.Открыта() Тогда ФормаВыбораДокумента.Активизировать(); Иначе ФормаВыбораДокумента.ОткрытьМодально(); КонецЕсли; // Получаем форму списка ФормаСпискаДокумента = Документы.ЗаказПокупателя.ПолучитьФорму("ФормаСписка"); // Проверяем, если форма уже открыта, обновляем ее Если ФормаСпискаДокумента.Открыта() Тогда ФормаСпискаДокумента.Обновить(); Иначе ФормаСпискаДокумента.Открыть(); КонецЕсли; Как видно из примера, достаточно указать наименование формы документа, чтобы получить доступ ко всем свойствам и методам, управляющим поведением и отображением объекта формы. Для открытия формы мы использовали методы Открыть и ОткрытьМодально. Первый открывает форму и выводит ее на экран, а второй, кроме того, позволяет задать режим модальности. При таком режиме пользователь должен прежде закрыть данную форму, чтобы продолжить работу с другими окнами. Метод Открыть помогает убедиться, что открываемая форма уже не открыта раньше. Метода Активизировать делает открытую форму активной (доступной для ввода данных), а метод Обновить — просто обновляет все элементы формы.
Дополнительно, в методе ПолучитьФорму можно задать владельца открываемой формы, так называемую родительскую форму, из которой открывается данная форма. Владелец задается вторым необязательным аргументом. Существует еще и третий необязательный аргумент, представляющий собой уникальный ключ, по которому можно искать уже открытую форму. Для наглядности изложенного посмотрите пример, представленный в листинге 4.2.
Листинг 4.2. Дополнительные возможности метода ПолучитьФорму
// Получаем форму списка из другой формы-владельца ФормаСпискаДокумента = Документы.ОприходованиеТоваров.ПолучитьФорму("ФормаСписка", Владелец); // Устанавливаем свойство закрытия при закрытии владельца формы ФормаСпискаДокумента.ЗакрыватьПриЗакрытииВладельца = Истина; // Открываем полученную форму ФормаСпискаДокумента.Открыть(); // Получаем форму и задаем уникальный ключ ФормаВыбораДокумента = Документы.ОприходованиеТоваров.ПолучитьФорму^'ФормаВыбора",, "ключ1"); // Открываем полученную форму ФормаВыбораДокумента.Открыть(); // Получаем форму, используя уникальный ключ ФормаВыбораДокумента = Документы.ОприходованиеТоваров.ПолучитьФорму(,, "ключ1"); // Открываем форму в виде модального окна ФормаВыбораДокумента.ОткрытьМодально(); В качестве владельца может выступать любая форма, заданная в конфигурации. Установленный признак ЗакрыватьПриЗакрытииВладельца приводит к автоматическому закрытию формы при закрытии владельца. Уникальный ключ, доступный как для чтения, так и для записи, помогает однозначно идентифицировать объект формы, исключив случайные совпадения имен. Неповторимое значение ключа можно сформировать с помощью объекта УникальныйИдентификатор. Использование ключа при открытии формы позволяет реализовать вывод на экран нескольких копий одного документа.
Для упрощения процесса вызова нужного типа формы, можно воспользоваться дополнительными методами объекта ДокументМенеджер:
  • ПолучитьФормуВыбора — вызывает форму выбора для указанного типа документа;
  • ПолучитьФормуСписка — вызывает форму списка документа;
  • ПолучитьФормуНовогоДокумента — вызывает форму для заполнения нового документа.
Названия этих методов говорят сами за себя. Все они имеют по три необязательных аргумента: наименования формы, владельца формы и уникального ключа. В отличие от метода ПолучитьФорму, где первый аргумент (наименование формы, заданное в конфигураторе) требуется указывать всегда, дополнительные методы просто получают определенный тип формы. Пример использования этих методов представлен в листинге 4.3.
Листинг 4.3. Дополнительные методы получения форм документа
// Получаем форму списка документа ФормаСпискаДокумента = Документы.АвансовыйОтчет.ПолучитьФормуСписка(); // Открываем полученную форму ФормаСпискаДокумента.Открыть(); // Формируем уникальный ключ ГУИД = Новый УникальныйИдентификатор; // Получаем форму выбора документа и назначаем ей уникальный ключ ФормаВыбораДокумента = Документы.АвансовыйОтчет.ПолучитьФормуВыбора(,, ГУИД); // Открываем полученную форму ФормаВыбораДокумента.ОткрытьМодально(10); // Получаем эту же форму по значению ключа ФормаВыбораДокументаПоКлючу = Документы.АвансовыйОтчет.ПолучитьФорму(,, ГУИД); // Если форма уже открыта, активизируем ее Если ФормаВыбораДокументаПоКлючу.Открыта() Тогда ФормаВыбораДокументаПоКлючу.Активизировать(); Иначе ФормаВыбораДокументаПоКлючу.Открыть(); КонецЕсли; // Получаем форму нового документа ФормаНовогоДокумента = Документы.АвансовыйОтчет.ПолучитьФормуНовогоДокумента(); Рассмотренные варианты получения различных типов форм демонстрируют широкие возможности, доступные разработчику для управления формами документов.
В базовом объекте ДокументОбъект имеется один метод для получения формы. Называется он ПолучитьФорму, имеет три необязательных аргумента, а в остальном ничем ни отличается от аналогичного метода объекта
ДокументМенеджер. Для объекта ДокументСсылка также предусмотрен метод ПолучитьФорму. Примеры их использования приведены в листинге 4.4.
Листинг 4.4. Получение форм документа из объектов ДокументОбъект и ДокументМенеджер
// Делаем выборку документов из базы ВыборкаПриходныйОрдерНаТовары = Документы.ПриходныйОрдерНаТовары.Выбрать(); // Организуем цикл для обработки найденных документов Пока ВыборкаПриходнмОрдерНаТовары.Следующий Цикл // Получаем объект документа ОбъектПриходныйОрдерНаТовары = ВыборкаПриходныйОрдерНаТовары.ПолучитьОбъект(); // Получаем форму документа ФормаДокумента = ОбъектПриходныйОрдерНаТовары.ПолучитьФорму(); Если НЕ ФормаВыбораДокументаПоКлючу.Открыта() Тогда ФормаДокумента.Открыть(); КонецЕсли; КонецЦикла; // Делаем выборку документов из базы ВыборкаРеализацияТоваров = Документы.РеализацияТоваров.Выбрать(); // Организуем обход в цикле для всех полученных документов Пока ВыборкаРеализацияТоваров.Следующий() Цикл // Получаем ссылку на документ СсылкаРеализацияТоваров = ВыборкаРеализацияТоваров.Ссылка; // Получаем форму документа ФормаДокумента = СсылкаРеализацияТоваров.ПолучитьФорму(); // Открываем полученную форму документа ФормаДокумента.Открыть(); КонецЦикла; И последнее, что хотелось бы представить вниманию читателей — это получение так называемых общих форм. Общие формы позволяют использовать какой-либо стандартный набор действий, доступный из любого объекта конфигурации. Например, чтобы не создавать для каждого документа формы поиска и отбора по списку, достаточно построить одну общую форму и вызывать по мере необходимости из разных документов. Для получения любой общей формы предназначен глобальный метод ПолучитьОбщуюФорму. Он имеет три необязательных аргумента, аналогичных рассмотренным ранее для метода ПолучитьФорму. Пример его использования представлен в листинге 4.5.
Листинг 4.5. Получение общих форм конфигурации_
// Получаем стандартную общую форму ФормаЦеныИВалюта ОбщаяФорма = ПолучитьОбщуюФорму("ФормаЦеныИВалюта"); // Выполняем настройку элементов управления общей формы //... // Открываем полученную форму ОбщаяФорма.ОткрытьМодально(); Как видите, получить общую форму достаточно просто. Однако перед тем, как открыть ее, как правило, требуется выполнить настройку элементов управления и заполнить начальные параметры использования. Поскольку настройки даже для стандартных (поставляемых фирмой 1С) обших форм могут сильно отличаться, здесь мы их приводить не будем.
Глава 5. Чтение и установка свойств
В этой главе мы поговорим о существующих свойствах документов, доступных через базовые объекты конфигурации: ДокументОбъект, ДокументСпи-сок, ДокументВыборка и ДокументСсылка. Свойства позволяют получить различную информацию о документе: значения реквизитов и табличных частей, определить состояние документа и многое другое. Установить свойства возможно только через ДокументОбъект, в остальных случаях доступно лишь чтение значений.
С помощью объекта ДокументОбъект, в первую очередь, можно обратиться к значениям реквизитов, заданным в конфигураторе для данного документа. Поскольку реквизиты у разных документов разные, необходимо изучить структуру каждого перед использованием. Реквизиты хранят различную информацию о документе: валюта, сумма документа, наименование организации и контрагента, вид документа, кратность, ответственный и др. Рассмотрим на примере, представленном в листинге 5.1, работу со свойствами документов.
Листинг 5.1. Чтение реквизитов документа_
// Задаем критерии выборки по дате НачальнаяДата = НачалоДня(ТекущаяДата()); КонечнаяДата = КонецДня(ТекущаяДата()); // Делаем выборку документов из базы за текущий день ВыборкаВнутреннийЗаказ = Документы.ВнутреннийЗаказ.Выбрать(НачальнаяДата, КонечнаяДата); // Организуем цикл для обработки найденных документов Пока ВыборкаВнутреннийЗаказ.Следующий() Цикл // Получаем объект документа Объект = ВыборкаВнутреннийЗаказ.ПолучитьОбъект(); // Читаем значения реквизитов и выводим в окно сообщений Сообщить("Номер документа: " + Объект.Номер); // Валюта документа Сообщить("Валюта документа: " + Объект.ВалютаДокумента); // Наименование склада компании Сообщить("Склад компании: " + Объект.СкладКомпании); // Признак автоматического резервированиия документа Сообщить("Авторезервирование: " + (Объект.АвтоРезервирование, "истина", "ложь"); // Признак автоматического размещения Сообщить("Авторазмещение: " + (Объект.АвтоРазмещение, "истина", "ложь"); // Наименование организации Сообщить("Наименование организации: " + Объект.Организация); // Ответственный за формирование документа Сообщить("Ответственный сотрудник: ", Объект.Ответственный); КонецЦикла; Как видно из примера, вначале мы организовали выборку документов на текущую дату. Для получения объекта применили метод ПолучитьОбъект. Таким образом, нам стали доступны все реквизиты документа, которые мы успешно прочитали и вывели в окно служебных сообщений 1С.
Установка реквизитов не сильно отличается от чтения, но следует правильно передавать значения типов, согласно назначенным в конфигураторе. Пример записи реквизитов представлен в листинге 5.2.
Листинг 5.2. Установка реквизитов документа_
// Задаем критерии выборки по дате НачальнаяДата = НачалоДня(ТекущаяДата()); КонечнаяДата = КонецДня(ТекущаяДата()); // Делаем выборку документов из базы за текущий день ВыборкаЗаказПоставщику = Документы.ЗаказПоставщику.Выбрать(НачальнаяДата, КонечнаяДата); // Организуем цикл для обработки найденных документов СчетчикНомера = 1; Пока ВыборкаЗаказПоставщику.Следующий() Цикл // Получаем объект документа Объект = ВыборкаЗаказПоставщику.ПолучитьОбъект(); // Устанавливаем значения реквизитов Объект.Номер = "Новый номер " + Строка(СчетчикНомера); // Получаем ссылку на валюту СсылкаВалюта = Справочники.Валюты.НайтиПоНаименованию("КШ"); // Устанавливаем выбранную валюту для документа Объект.ВалютаДокумента = СсылкаВалюта; // Выбираем новую организацию СсылкаОрганизация = Справочники.Организации.НайтиПоКоду("0015"); // Устанавливаем новую ссылку на организацию Объект.Организация = СсылкаОрганизация; // Выбираем нового ответственного СсылкаОтветственный = Справочники.ФизическиеЛица. НайтиПоНаименованию("Иванов И.И."); // Сохраняем сделанные изменения в базе Объект.Записать(); СчетчикНомера = СчетчикНомера + 1; КонецЦикла; Итак, в рассмотренном примере мы выполнили установку реквизитов документов. Список документов получили через объект ДокументВыборка. Во-первых, мы изменили номера выбранных документов, воспользовавшись числовой переменной СчетчикНомера для формирования уникального значения. Далее установили новую валюту. Поскольку тип реквизита является ссылкой на справочник валют, нам понадобилось вначале получить ссылку на выбранную валюту. Для этого был выбран метод НайтиПоНаименованию. Как он работает, вы уже знаете. Кроме того, используя ссылки, мы скорректировали в документах организацию и ответственного за создание документа. Чтобы сохранить сделанные изменения, вызвали метод Записать.
Объект ДокументОбъект позволяет также получить доступ к табличным частям документа. Имена табличных частей, заданные в конфигураторе, и являются свойствами документа. Однако, в отличие от реквизитов, данные табличных частей открытую можно только читать. Посмотрите, как это делается в листинге 5.3.
Листинг 5.3. Чтение реквизитов табличных частей документа_
// Делаем выборку всех документов из базы ВыборкаРеализацияТоваровУслуг = Документы.РеализацияТоваровУслуг.Выбрать(); // Организуем цикл для обработки найденных документов Пока ВыборкаРеализацияТоваровУслуг.Следующий() Цикл // Получаем объект документа Объект = ВыборкаРеализацияТоваровУслуг.ПолучитьОбъект(); // Получаем таблиную часть Товары ТЧ_Товары = Объект.Товары; // Выводим наименование номенклатуры Сообщить("Номенклатура: " + ТЧ_Товары.Номенклатура); // Выводим характеристику номенклатуры Сообщить("Характеристика номенклатуры: " + ТЧ_Товары.ХарактеристикаНоменклатуры); // Выводим количество товара Сообщить("Количество: " + Строка(ТЧ_Товары.Количество)); // Выводим серию номенклатуры Сообщить("Серия номенклатуры: " + ТЧ_Товары.СерияНоменклатуры); // Получаем табличную часть Услуги ТЧ_Услуги = Объект.Услуги; // Получаем наименование услуги Сообщить("Наименование услуги: " + ТЧ_Услуги.Номенклатура); // Получаем количество Сообщить("Количество: " + Формат(ТЧ_Услуги.Количество, "ЧЦ=15;ЧДЦ=3")); // Получем единицу измерения Сообщить("Единица измерения: " + Строка(ТЧ_Услуги.ЕдиницаИзмерения)); // Получаем табличную часть ВозвратнаяТара ТЧ_ВозвратнаяТара = Объект.ВозвратнаяТара; // Получаем наименование возвратной тары Сообщить("Наименование тары: " + ТЧ_ВозвратнаяТара.Номенклатура); // Получаем количество Сообщить("Количество: " + Формат(ТЧ_ВозвратнаяТара.Количество, "ЧЦ=15;ЧДЦ=3")); // Получаем цену Сообщить("Цена: " + Формат(ТЧ_ВозвратнаяТара.Цена, "ЧЦ=15;ЧДЦ=2")); // Получаем значение суммы Сообщить("Сумма возвратной тары: " + Формат(ТЧ_ВозвратнаяТара.Сумма, "ЧЦ=15;ЧДЦ=2")); КонецЦикла; Как видите, получить значения реквизитов табличных частей достаточно просто. Поскольку документ РеализацияТоваровУслуг в варианте конфигурации УПП содержит три табличные части, мы получили все три. Однако в вашей конфигурации может отсутствовать, например, табличная часть Услуги, поэтому всегда проверяйте структуру документов именно в той конфигурации, в которой вы работаете.
Объект ДокументОбъект позволяет еще управлять следующими значениями свойств: номер и дата документа, признак проведения и признак удаления. Эти свойства доступны как для чтения, так и для записи. Пример работы с ними представлен в листинге 5.4.
Листинг 5.4. Чтение и установка свойств документа
// Делаем выборку всех документов из базы ВыборкаПоступлениеДопРасходов = Документы.ПоступлениеДопРасходов.Выбрать(); // Организуем цикл для обработки найденных документов Пока ВыборкаПоступлениеДопРасходов.Следующий() Цикл // Получаем объект документа Объект = ВыборкаПоступлениеДопРасходов.ПолучитьОбъект(); // Получаем и устанавливаем номер документа НомерДокумента = Объект.Номер; Объект.Номер = НомерДокумента + " новый"; // Получаем и устанавливаем дату документа ДатаДокумента = Объект.Дата; Объект.Дата = ТекущаяДата(); // Определяем признак проведения документа Если Объект.Проведен Тогда Объект.Проведен = Ложь; КонецЕсли; // Определяем признак пометки на удаление Если Объект.ПометкаУдаления Тогда Объект = Ложь; КонецЕсли; // Сохраняем изменения в базе Объект.Сохранить(); КонецЦикла; И последние свойства, о которых хотелось бы здесь упомянуть, доступны только для чтения и помогают получить сведения о движениях документа, ссылке на документ и обращения к самому объекту документа.
Движения документа можно прочитать из свойства Движения, которое возвращает коллекцию наборов записей о движениях документа в системе. На этапе разработки в свойствах документа задаются объекты (регистры), по которым документ может выполнять движения. Приведем пример получения движений документа по заданным в конфигураторе регистрам (листинг 5.5).
Листинг 5.5. Получение информации о движениях документа
// Делаем выборку всех документов из базы ВыборкаПланПродаж = Документы.ПланПродаж.Выбрать(); // Организуем цикл для обработки найденных документов Пока ВыборкаПланПродаж.Следующий() Цикл // Получаем объект документа Объект = ВыборкаПланПродаж.ПолучитьОбъект(); // Получаем коллекцию движений документа ДвиженияПоРегистрам = Объект.Движения; // Выбираем движения по регистру сведений ЦеныКонтрагентов ДвиженияЦеныКонтрагентов = ДвиженияПоРегистрам.ЦеныКонтрагентов; // Читаем набор записей ДвиженияЦеныКонтрагентов.Прочитать(); Для Каждого Запись Из ДвиженияЦеныКонтрагентов Цикл Сообщить(Запись.Цена); КонецЦикла; // Выбираем движения по регистру накопления ЗаказыПокупателей ДвиженияЗаказыПокупателей = ДвиженияПоРегистрам.ЗаказыПокупателей; // Читаем набор записей ДвиженияЗаказыПокупателей.Прочитать(); Для Каждого Запись Из ДвиженияЗаказыПокупателей Цикл Сообщить(Запись.Количество); КонецЦикла; // Выбираем движения по регистру накопления ПартииТоваровКомпании ДвиженияПартииТоваровКомпании = ДвиженияПоРегистрам.ПартииТоваровКомпании; // Читаем набор записей ДвиженияПартииТоваровКомпании.Прочитать(); Для Каждого Запись Из ДвиженияПартииТоваровКомпании Цикл Сообщить(Запись.Количество); Сообщить(Запись.Стоимость); КонецЦикла; КонецЦикла; Итак, сделав выборку из базы, мы получили доступ к объекту документа. После этого, используя свойство Движения, прочитали коллекцию наборов движений документа по регистрам. По каким именно регистрам проходит документ, задается в конфигураторе. В данном случае, мы выбрали данные о движениях по регистру сведений ЦеныКонтрагентов и двум регистрам накопления — ЗаказыПокупателей и ПартииТоваровКомпании. С помощью метода Прочитать получаем из регистра набор записей для указанного документа. Далее делаем обход по записям и считываем значения ресурсов регистра.
Свойство Ссылка позволяет получить ссылку на документ, а свойство этотОбъект возвращает сам объект документа. Его удобно применять в модулях формы или объекта. Пример работы с этими свойствами представлен в листинге 5.6.
Листинг 5.6. Использование свойств Ссылка и ЭтотОбъект
// Делаем выборку всех документов из базы ВыборкаЗаказПоставщику = Документы.ЗаказПоставщику.Выбрать(); // Организуем цикл для обработки найденных документов Пока ВыборкаЗаказПоставщику.Следующий() Цикл // Получаем объект документа Объект = ВыборкаЗаказПоставщику.ПолучитьОбъект(); // Получаем ссылку на документ СсылкаЗаказПоставщику = Объект.Ссылка; КонецЦикла; // Если мы находимся в модуле объекта или формы документа // Получаем ссылку на документ без метода ПолучитьОбъект СсылкаЗаказПоставщику = этотОбъект.Ссылка; Объект ДокументСписок также имеет несколько полезных свойств, о которых мы сейчас поговорим. К слову, создать данный объект программно не получится. Он создается системой автоматически на этапе создания формы списка документов или явном добавлении разработчиком на закладке реквизитов формы. С помощью него организуется отбор, сортировка и размещение колонок в таблице списка документов. Через свойства этого объекта можно управлять размещением и отображением колонок в табличной части, работать с отборами и сортировкой. Отборы нужны для наложения ограничений (по дате, организации и т. д.) на отображаемую в таблице информацию. Сортировки помогают упорядочить вывод данных по порядку (например, по дате создания в порядке убывания). Посмотрите в листинге 5.7, как можно применять свойства объекта ДокументСписок для вывода информации об установленных полях отбора.
Листинг 5.7. Получение данных об установленных отборах
// Прочитаем отборы, установленные для списка документов формы Для Каждого элементОтбора Из этаФорма.ДокументСписок.Отбор Цикл // Проверяем использование поля в отборе Если ЭлементОтбора.Использование Тогда // Выводим имя и представление элемента отбора Сообщить(ЭлементОтбора.Имя + ЭлементОтбора.Представление); // Выводим вид сравнения Сообщить(ЭлементОтбора.ВидСравнения); // Выводим значение отбора Сообщить(ЭлементОтбора.Значение); // Выводим диапазон значений Сообщить(ЭлементОтбора.ЗначениеС + " " + ЭлементОтбора.ЗначениеПо); КонецЕсли; КонецЦикла; Для получения данных полей отбора мы применили цикл, в котором выбрали с помощью объекта Отбор имена и представления всех используемых (свойство Использование) отборов, а также вид сравнения и выбранный период. Чтобы установить отбор по определенному полю таблицы, достаточно через объект Отбор присвоить значение поля отбора и установить для него свойство Использование в значение Истина. Пример установки отбора по реквизитам документа представлен в листинге 5.8.
Листинг 5.8. Установка отбора по реквизиту документа
// Устанавливаем отбор по организации ЭтаФорма.ДокументСписок.Отбор.Организация.ВидСравнения = ВидСравнения.Равно; ЭтаФорма.ДокументСписок.Отбор.Организация.Значение = Организация; ЭтаФорма.ДокументСписок.Отбор.Организация.Использование = Истина; // Устанавливаем отбор по ответственному ЭтаФорма.ДокументСписок.Отбор.Организация.ВидСравнения = ВидСравнения.Равно; ЭтаФорма.ДокументСписок.Отбор.Ответственный.Значение = Ответственный; ЭтаФорма.ДокументСписок.Отбор.Ответственный.Использование = Истина; Объект Отбор имеет набор элементов отбора, совпадающий с заданными для документа реквизитами. В свою очередь, для каждого элемента отбора доступны стандартные свойства: вид сравнения (устанавливает вид операции сравнения), значение (для реквизитов, не использующих период), значения
периода, имя, представление, использование (указывает, используется ли данный элемент в отборе) и др.
Свойство Порядок (объект Порядок) позволяет настроить сортировку списка по возрастанию или убыванию. Как правило, такая необходимость возникает при отображении данных с учетом даты создания, суммы документа или других критериев. Пример работы со свойством Порядок представлен в листинге 5.9.
Листинг 5.9. Получение данных об установленных сортировках
// Прочитаем сортировки, установленные для списка документов формы Для Каждого ЭлементПорядка Из ЭтаФорма.ДокументСписок.Порядок Цикл // Выводим имя и представление элемента сортировки Сообщить(ЭлементПорядка.Имя + ЭлементПорядка.Представление); // Выводим направление сортировки Сообщить(ЭлементПорядка.Направление); КонецЦикла; И последнее свойство, доступное для объекта ДокументСписок, называется Колонки. Оно позволяет получить сведения обо всех колонках текущего списка документов. Количество колонок зависит от количества реквизитов документа, заданных в конфигураторе. Для получения сведений об используемых в списке колонках можно написать код, как в листинге 5.10.
Листинг 5.10. Получение сведений о колонках списка документов
// Прочитаем имена колонок Для Каждого КолонкаСписка Из ЭтаФорма.ДокументСписок.Колонки Цикл // Выводим имя колонки списка Сообщить(КолонкаСписка.Имя); // Выводим признак автоудаления Сообщить(КолонкаСписка.АвтоУдаление); КонецЦикла; Из примера видно, что, воспользовавшись циклом, мы перебрали все доступные колонки списка документа и вывели в окно служебных сообщений имя и признак автоудаления для каждой колонки. Признак автоудаления позволяет определить признак удаления колонки из списка при удалении соответствующей колонки из таблицы. Хочу заметить, что объект списка документов и табличное поле документа, отображающее колонки данных, являются разными объектами в отношении установки отбора, сортировки или управления колонками. Первый из них содержит данные запроса, а второй выводит информацию на экран.
И последний объект, о свойствах которого хотелось упомянуть — это ДокументСсылка. Его доступные свойства можно лишь читать, и они не отличаются от свойств объекта ДокументОбъект. Для работы с ними достаточно получить ссылку на документ. Получение ссылок подробно рассмотрено в главе 3.
Глава 6. Заполнение данными
В этой главе мы поговорим о том, как программно заполнять данными различные документы. Как правило, необходимость в этом возникает при пакетной обработке большого числа документов или при автоматическом формировании новых документов на основании других.
В общем случае, наша задача сводится к двум основным действиям: заполнение требуемых реквизитов и заполнение табличной части документа. Чтобы сформировать новый вид документа на основании другого, можно воспользоваться методом Заполнить объекта ДокументОбъект. Он принимает один аргумент, который может быть ссылкой на другой документ, на основании которого формируется новый документ. Пример использования данного метода представлен в листинге 6.1.
Листинг 6.1. Использование метода Заполнить
// Получаем ссылку на нужный документ СсылкаЗаказПоставщику = Документы.ЗаказПоставщику.НайтиПоНомеру("001"); // Проверяем существование документа Если НЕ СсылкаЗаказПоставщику.Пустая() Тогда // Создаем новый документ на основании заказа поставщику НовыйПоступлениеТоваров = Документы.ПоступлениеТоваров.СоздатьДокумент(); // Заполняем новое поступление на основании заказа НовыйПоступлениеТоваров.Заполнить(СсылкаЗаказПоставщику); // Записываем новый документ в базу НовыйПоступлениеТоваров.Записать(); // или открываем форму документа для редактирования // ФормаДокумента = // НовыйПоступлениеТоваров.ПолучитьФорму("ФормаДокумента"); // Открываем форму документа // ФормаДокумента.Открыть(); КонецЕсли; Как видно из примера, вначале мы получили ссылку на документ заказа, на основании которого необходимо создать новый документ поступления. После этого с помощью метода СоздатьДокумент сформировали новый пустой документ. Далее вызываем метод Заполнить и заполняем реквизиты и табличную часть нового документа. В итоге вновь созданный документ мы можем либо записать в базу, либо открыть для редактирования пользователем. Как видите, все достаточно просто и красиво.
Рассмотренный алгоритм удобно применять, когда в конфигураторе заданы документы, вводимые на основании исходного. Данная операция выполняется при разработке новой конфигурации. В свойствах любого документа можно с помощью специального конструктора настроить процедуру ввода на основании. В готовой конфигурации следует проверить, какие виды документов заданы для ввода на основании исходного. Например, на основании документа ЗаказПокупателя можно сформировать документы: РеализацияТоваровУслуг, ВозвратТоваровОтПокупателя, КорректировкаЗаказаПокупателя, Приходный КассовыйОрдер и др.
Когда же возникает необходимость сформировать новый документ на основании другого, и он не задан явно в конфигураторе, приходится самостоятельно заполнять необходимые реквизиты и табличную часть документа. Посмотрите на пример такого кода, представленный в листинге 6.2.
Листинг 6.2. Использование метода Заполнить
// Получаем ссылку на нужный документ СсылкаЗаказПокупателя = Документы.ЗаказПокупателя.НайтиПоНомеру("005"); // Проверяем существование документа Если НЕ СсылкаЗаказПокупателя.Пустая() Тогда // Создаем новый документ НовыйАвансовыйОтчет = Документы.АвансовыйОтчет.СоздатьДокумент(); // Заполняем реквизиты НовыйАвансовыйОтчет.Номер = СсылкаЗаказПокупателя.Номер; НовыйАвансовыйОтчет.Дата = СсылкаЗаказПокупателя.Дата; НовыйАвансовыйОтчет.ВидОперации = Перечисления.ВидОперацийАвансовыйОтчет.АвансовыйОтчет; НовыйАвансовыйОтчет.КурсДокумента = СсылкаЗаказПокупателя.КурсДокумента; НовыйАвансовыйОтчет.ВалютаДокумента = СсылкаЗаказПокупателя.ВалютаДокументаДокумента; НовыйАвансовыйОтчет.КратностьДокумента = СсылкаЗаказПокупателя.КратностьДокумента; НовыйАвансовыйОтчет.Организация = СсылкаЗаказПокупателя.Организация; НовыйАвансовыйОтчет.Ответственный = СсылкаЗаказПокупателя.Ответственный; НовыйАвансовыйОтчет.Подразделение = СсылкаЗаказПокупателя.Подразделение; НовыйАвансовыйОтчет.Склад = СсылкаЗаказПокупателя.Склад; НовыйАвансовыйОтчет.ТипЦен = СсылкаЗаказПокупателя.ТипЦен; НовыйАвансовыйОтчет.СуммаДокумента = СсылкаЗаказПокупателя.СуммаДокумента; // Заполняем табличную часть Товары Для Каждого СтрокаТЧЗаказ Из СсылкаЗаказПокупателя.Товары Цикл СтрокаТЧАвансовыйОтчет = СтрокаТЧАвансовыйОтчет.Товары.Добавить(); СтрокаТЧАвансовыйОтчет.Номенклатура = СтрокаТЧЗаказ.Номенклатура; СтрокаТЧАвансовыйОтчет.Количество = СтрокаТЧЗаказ.Количество; СтрокаТЧАвансовыйОтчет.ЕдиницаИзмерения = СтрокаТЧЗаказ.ЕдиницаИзмерения; СтрокаТЧАвансовыйОтчет.Коэффициент = СтрокаТЧЗаказ.Коэффициент; СтрокаТЧАвансовыйОтчет.ХарактеристикаНоменклатуры = СтрокаТЧЗаказ.ХарактеристикаНоменклатуры; СтрокаТЧАвансовыйОтчет.Цена = СтрокаТЧЗаказ.Цена; СтрокаТЧАвансовыйОтчет.Сумма = СтрокаТЧЗаказ.Сумма; СтрокаТЧАвансовыйОтчет.СтавкаНДС = СтрокаТЧЗаказ.СтавкаНДС; СтрокаТЧАвансовыйОтчет.СуммаНДС = СтрокаТЧЗаказ.СуммаНДС; КонецЦикла; // Открываем форму документа для редактирования // ФормаДокумента = // НовыйАвансовыйОтчет.ПолучитьФорм[у("ФормаДокумента"); // Открываем форму документа // ФормаДокумента.Открыть(); КонецЕсли; Приведенный пример чисто условный, поскольку в реальном документообороте не создается новый авансовый отчет на основании заказ покупателя. Основной целью ставилось показать, как программно передавать данные из одного документа в другой.
Итак, мы создали новый документ. После этого заполнили реквизиты, скопировав их из исходного документа ЗаказПокупателя. Чтобы сформировать табличную часть, организовали цикл, в котором последовательно выбрали все записи из товарной части заказа. С помощью метода Добавить создали новые записи в табличной части нового документа. После копирования всех данных открыли форму документа для редактирования.
Подобным способом можно передавать различные значения реквизитов и табличных частей между документами, когда в этом возникает необходимость.
Источник: http://ru.pcmag.com/programmnoe-obespechenie/14548/library/1spredpriiatie-80-priemy-programmirovaniia?p=2


Поделись с друзьями



Рекомендуем посмотреть ещё:



Платформа 8.2: Получить открытую форму. Управляемое приложение Трансформация жизненного сценария

Как получить уже открытую форму документа Получить открытую форму документа - 1С: Типовые и стандартные
Как получить уже открытую форму документа Спасаем документ, запись которого невозможна. Или как
Как получить уже открытую форму документа 1с 8.2 получить открытую форму документа Jokerit - Aitais Blogs
Как получить уже открытую форму документа 8.х - Передача данных в уже открытую форму - форум по
Как получить уже открытую форму документа Как обратиться к открытой форме документа
Как получить уже открытую форму документа Глава 4. Получение форм стр. 2 - PCMag Russian Edition
Как получить уже открытую форму документа 60 минут. Выпуск от. Капкан для Трампа
Rivka381 Красноярский государственный аграрный университет Мой домик для монстр хай для конкурса маркиза де люкс Новые сценарии - короткометражные - конкурс сценариев - Сценарист. РУ

ШОКИРУЮЩИЕ НОВОСТИ