🔥 Горящие вакансии
Все статьи

Заполнение реквизита формы (дерево значений) в 1С: внешняя обработка заполнения объекта

Эту и другие технические статьи написали наши программисты 1С и получили за них премии. Если вы тоже работаете с 1С и любите делиться опытом, приходите разработчиком в Neti

Рассмотрим задачу, когда нужно заполнить данные формы объекта, которые не являются реквизитами объекта.

👉 Смотрите также:   Как заполнить дерево значений на форме в 1С

Рассмотрим на примере. Заполним элемент ДеревоЦен (реквизит формы, не реквизит Объекта!) формы документа Установка цен номенклатуры конфигурации УТ 11.0.7.21:

Заполнение реквизита формы (дерево значений) в 1С: внешняя обработка заполнения объекта

Элемент ДеревоЦен

В элемент ДеревоЦен записываются данные по номенклатуре, а в подчиненные номенклатуре строки – данные по характеристикам номенклатуры. В результате в табличной части Товары документа Установка цен номенклатуры находятся строки по Номенклатуре (без характеристики) и строки по Характеристикам номенклатуры (т.е. получается как развернутый вид дерева значений ДеревоЦен).

Элемент ДеревоЦен будем заполнять товарами из ассортимента выбранного партнера, для этого в конфигурацию добавлен регистр сведений пр_АссортиментТоваров с измерениями Партнер и Характеристика; в документ Установка цен номенклатуры добавлен реквизит пр_Партнер.

Т.к. рассматриваем пример внешней обработки по заполнению объекта, то в модуле внешней обработки прописываем соответствующие процедуры:

Функция СведенияОВнешнейОбработке() Экспорт
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.УстановкаЦенНоменклатуры");
 
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Заполнение Установки цен номенклатуры");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка Заполнение Установки цен номенклатуры по Ассортименту товаров");

    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Заполнить по Ассортименту товаров", "_ЗаполнениеУстановкиЦенНоменклатуры", "ВызовКлиентскогоМетода", Истина);
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
  Команды = Новый ТаблицаЗначений;
  Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
  Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
  Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
  НоваяКоманда = ТаблицаКоманд.Добавить();
  НоваяКоманда.Представление = Представление;
  НоваяКоманда.Идентификатор = Идентификатор;
  НоваяКоманда.Использование = Использование;
  НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
  НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

Далее, т.к. используем ВызовКлиентскогоМетода, добавляем форму обработки. В модуле формы обработки прописываем процедуру ВыполнитьКоманду():

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
                Документ = ОбъектыНазначенияМассив[0];
               
                Парам = Новый Структура("Ключ", Документ);
                Форма = ПолучитьФорму("Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента", Парам);
               
                ДеревоЦенДанныеФормы = Форма.ДеревоЦен;
                Заполнить(ДеревоЦенДанныеФормы, Документ);    
                КопироватьДанныеФормы(ДеревоЦенДанныеФормы, Форма.ДеревоЦен);
КонецПроцедуры        

Процедура Заполнить(ДеревоЦенДанныеФормы, Документ)
                Запрос = Новый Запрос;
                Запрос.Текст = "ВЫБРАТЬ
                               |             пр_АссортиментТоваров.Характеристика КАК Характеристика,
                               |             пр _АссортиментТоваров.Характеристика.Владелец КАК Номенклатура,
                               |             пр_АссортиментТоваров.Характеристика.Владелец.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
                               |             пр_АссортиментТоваров.Характеристика.Владелец.ЦеноваяГруппа КАК ЦеноваяГруппа,
                               |                пр_АссортиментТоваров.Характеристика.Владелец.ВидНоменклатуры.ИспользованиеХарактеристик КАК ИспользованиеХарактеристик
                               |ИЗ
                               |             РегистрСведений.пр_АссортиментТоваров КАК пр_АссортиментТоваров
                               |ГДЕ
                               |             пр_АссортиментТоваров.Партнер = &Партнер
                               |ИТОГИ
                               |             МАКСИМУМ(Характеристика),
                               |             МАКСИМУМ(ЕдиницаИзмерения),
                               |             МАКСИМУМ(ЦеноваяГруппа),
                               |             МАКСИМУМ(ИспользованиеХарактеристик)
                               |ПО
                               |             Номенклатура";
                Запрос.УстановитьПараметр("Партнер", Документ.пр_Партнер);
                РезультатПоНоменклатуре = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
               
                ДеревоЦенДЗ = ДанныеФормыВЗначение(ДеревоЦенДанныеФормы, Тип("ДеревоЗначений"));
               
                Пока РезультатПоНоменклатуре.Следующий() Цикл
                               СтрокаДерева = ДеревоЦенДЗ.Строки.Добавить();
                               СтрокаДерева.Номенклатура = РезультатПоНоменклатуре.Номенклатура;
                               СтрокаДерева.ЕдиницаИзмерения = РезультатПоНоменклатуре.ЕдиницаИзмерения;
                               СтрокаДерева.ЦеноваяГруппа = РезультатПоНоменклатуре.ЦеноваяГруппа;
                               Если РезультатПоНоменклатуре.ИспользованиеХарактеристик = Перечисления.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.НеИспользовать Тогда
                                               СтрокаДерева.ХарактеристикиИспользуются = Ложь;
                               Иначе
                                               СтрокаДерева.ХарактеристикиИспользуются = Истина;
                               КонецЕсли;
                              
                               РезультатПоХарактеристикам = РезультатПоНоменклатуре.Выбрать();
                               Пока РезультатПоХарактеристикам.Следующий() Цикл
                                               ПодСтрокаДерева = СтрокаДерева.Строки.Добавить();
                                               ПодСтрокаДерева.Номенклатура = РезультатПоХарактеристикам.Номенклатура;
                                               ПодСтрокаДерева.Характеристика = РезультатПоХарактеристикам.Характеристика;
                                               ПодСтрокаДерева.ЕдиницаИзмерения = РезультатПоХарактеристикам.ЕдиницаИзмерения;
                                               ПодСтрокаДерева.ЦеноваяГруппа = РезультатПоХарактеристикам.ЦеноваяГруппа;
                                               Если РезультатПоХарактеристикам.ИспользованиеХарактеристик = Перечисления.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.НеИспользовать Тогда
                                                               ПодСтрокаДерева.ХарактеристикиИспользуются = Ложь;
                                               Иначе
                                                               ПодСтрокаДерева.ХарактеристикиИспользуются = Истина;
                                               КонецЕсли;
                               КонецЦикла;
                КонецЦикла;
               
                ЗначениеВДанныеФормы(ДеревоЦенДЗ, ДеревоЦенДанныеФормы);
КонецПроцедуры

После подключения внешней обработки в пользовательском режиме (после добавления в справочник Дополнительные отчеты и обработки), в документе Установка цен номенклатуры появится кнопка Заполнение…, после нажатия на которую появится окно Команды заполнения объектов с названием команды, которую мы прописали в модуле объекта внешней обработки в процедуре СведенияОВнешнейОбработке() в строке «ДобавитьКоманду(ТаблицаКоманд, «Заполнить по Ассортименту товаров»»:

Заполнение реквизита формы (дерево значений) в 1С: внешняя обработка заполнения объекта

Заполнение документа

 

Оставить коментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Отправить резюме

    Я согласен на обработку персональных данных в соответствии
    со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

    Отправить резюме

      Я согласен на обработку персональных данных в соответствии
      со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

      Pекомендовать друга

        Отправьте контактные данные вашего друга и предупредите его, что мы с ним свяжемся. Когда друг успешно отработает 3 месяца, вы получите 20 000 ₽.


        Выбрать вакансию
        • Bitrix-разработчик
        • Программист 1С
        • Консультант-аналитик 1С
        • Проекты для команды специалистов 1С
        • Проекты для специалистов 1С
        • Стажёр-программист 1С
        • Ведущий консультант Microsoft Dynamics 365 Sales
        • Руководитель проектов Microsoft Dynamics 365 FO и AX 2012
        • Консультант Microsoft Dynamics AX на зарубежные проекты
        • Ведущий консультант Microsoft Dynamics 365 Finance and Operation
        • Ведущий разработчик Microsoft Dynamics AX на зарубежные проекты
        Я согласен на обработку персональных данных в соответствии
        со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

        Pекомендовать друга

          Отправьте контактные данные вашего друга и предупредите его, что мы с ним свяжемся. Когда друг успешно отработает 3 месяца, вы получите 20 000 ₽.


          Выбрать вакансию
          • Bitrix-разработчик
          • Программист 1С
          • Консультант-аналитик 1С
          • Проекты для команды специалистов 1С
          • Проекты для специалистов 1С
          • Стажёр-программист 1С
          • Ведущий консультант Microsoft Dynamics 365 Sales
          • Руководитель проектов Microsoft Dynamics 365 FO и AX 2012
          • Консультант Microsoft Dynamics AX на зарубежные проекты
          • Ведущий консультант Microsoft Dynamics 365 Finance and Operation
          • Ведущий разработчик Microsoft Dynamics AX на зарубежные проекты
          Я согласен на обработку персональных данных в соответствии
          со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

          Спасибо!

          Мы получили ваше резюме. Менеджер свяжется с вами в течение трех дней

          Горящие вакансии