При работе с конфигурациями 1С:Предприятие, в частности с 1С:Управление торговлей 11 (УТ11), разработчики часто сталкиваются с задачей расширения функциональности типовых объектов. Одним из распространенных сценариев является добавление новых значений в существующие перечисления через механизм расширений. Однако, иногда, после добавления таких значений, мы обнаруживаем, что они не отображаются в соответствующих полях форм документов, например, в поле СпособДоставки документа ЗаказКлиента. В этой статье мы подробно разберем, почему возникает такая ситуация и как эффективно решить данную проблему.
Давайте вместе выясним причины и рассмотрим пошаговые решения, которые помогут вам корректно отобразить добавленные в расширении значения перечисления в пользовательском интерфейсе.
Одной из наиболее частых причин, по которой новые значения перечисления не отображаются в выпадающем списке формы, является то, что стандартные элементы форм или программный код конфигурации могут ограничивать или динамически формировать список выбора для этого поля. Это означает, что даже если вы успешно добавили новое значение в перечисление через расширение, форма может просто "не знать" о нем, если список формируется не автоматически из метаданных, а программно.
Рассмотрим, где чаще всего встречается такое динамическое формирование списка:
ОбработкаПолученияДанныхВыбора() модуля менеджера перечисления.
Если в модуле менеджера вашего перечисления (например, Перечисления.СпособыДоставки) существует экспортная процедура ОбработкаПолученияДанныхВыбора(), то она, скорее всего, отвечает за формирование списка значений, которые будут предложены пользователю. В этой процедуре могут быть жестко заданы конкретные значения или применены сложные фильтры, исключающие определенные элементы. Если ваше новое значение не учтено в логике этой процедуры, оно не появится в списке.
Для примера, типовой код может выглядеть так:
// В модуле менеджера перечисления "СпособыДоставки"
Процедура ОбработкаПолученияДанныхВыбора(ПараметрыВыбора, СтандартнаяОбработка) Экспорт
Если ПараметрыВыбора.Свойство("ТипДокумента") И ПараметрыВыбора.ТипДокумента = ТипДокумента.ЗаказКлиента Тогда
// Здесь формируем список только для ЗаказовКлиента
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.СпособыДоставки.Самовывоз, "Самовывоз");
СписокЗначений.Добавить(Перечисления.СпособыДоставки.ДоКлиента, "До клиента");
// Другие стандартные значения...
ПараметрыВыбора.Установить("СписокВыбора", СписокЗначений);
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
В этом случае, чтобы ваше новое значение отобразилось, вам потребуется заимствовать этот модуль менеджера в расширение и доработать данную процедуру, добавив в СписокЗначений ваше новое значение.
ПриНачалеВыбораИзСписка() или ПриНачалеВыбора().
Аналогично, код, формирующий список выбора, может находиться непосредственно в модуле формы документа (например, ФормаДокумента.ЗаказКлиента) в обработчиках событий элемента формы, связанного с перечислением. Например, в процедуре СпособДоставкиПриНачалеВыбораИзСписка() или СпособДоставкиНачалоВыбора().
Пример кода:
// В модуле формы документа "ЗаказКлиента"
Процедура СпособДоставкиПриНачалеВыбораИзСписка(Элемент, СтандартнаяОбработка)
Если МойОбъект.ЗаказКлиента.ТипОперации = Перечисления.ТипыОпераций.Отгрузка Тогда
// Показываем только способы доставки, применимые для отгрузки
СтандартнаяОбработка = Ложь;
СписокВыбора = Новый СписокЗначений;
СписокВыбора.Добавить(Перечисления.СпособыДоставки.КурьерскаяСлужба, "Курьерская служба");
СписокВыбора.Добавить(Перечисления.СпособыДоставки.ПочтаРоссии, "Почта России");
// Добавляем ваше новое значение
СписокВыбора.Добавить(Перечисления.СпособыДоставки.НовыйСпособРасширение, "Новый способ из расширения");
Элемент.СписокВыбора = СписокВыбора;
КонецЕсли;
КонецПроцедуры
В этом случае вам потребуется заимствовать форму документа в расширение, а затем заимствовать и доработать соответствующий обработчик события, включив в него ваше новое значение перечисления.
Для того чтобы изменения в расширении повлияли на поведение стандартных форм или логику конфигурации, часто бывает недостаточно просто добавить новые метаданные (например, значение перечисления). Необходимо заимствовать в расширение те объекты, которые отвечают за обработку и отображение этих данных.
Если проблема заключается в процедуре ОбработкаПолученияДанныхВыбора() в модуле менеджера перечисления, вам следует добавить это перечисление в расширение с флагом "Заимствовать". После этого откройте модуль менеджера перечисления в расширении и внесите необходимые изменения. Важно убедиться, что ваша доработка учитывает и стандартные значения, и ваши новые.
Шаги:
СпособыДоставки). Установите флаг "Заимствовать" для него.ОбработкаПолученияДанныхВыбора().
// В заимствованном модуле менеджера перечисления "СпособыДоставки" в расширении
Процедура ОбработкаПолученияДанныхВыбора(ПараметрыВыбора, СтандартнаяОбработка) Экспорт
// Вызываем стандартную обработку, если это возможно,
// или полностью переопределяем, добавляя свои значения.
// Допустим, мы хотим добавить наше значение к уже существующему списку.
СтандартнаяОбработка = Истина; // Позволяем стандартной логике отработать
СуществующийСписок = ПараметрыВыбора.Получить("СписокВыбора");
Если СуществующийСписок <> Неопределено Тогда
// Добавляем наше новое значение
СуществующийСписок.Добавить(Перечисления.СпособыДоставки.НовыйСпособИзРасширения, "Новый способ из расширения");
Иначе
// Если стандартная обработка не сформировала список, создаем его сами.
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.СпособыДоставки.Самовывоз, "Самовывоз");
СписокЗначений.Добавить(Перечисления.СпособыДоставки.ДоКлиента, "До клиента");
СписокЗначений.Добавить(Перечисления.СпособыДоставки.НовыйСпособИзРасширения, "Новый способ из расширения");
ПараметрыВыбора.Установить("СписокВыбора", СписокЗначений);
СтандартнаяОбработка = Ложь; // Отменяем стандартную обработку, если мы ее полностью переопределили
КонецЕсли;
КонецПроцедуры
Если логика формирования списка находится непосредственно в форме документа, вам необходимо заимствовать эту форму в ваше расширение.
Шаги:
СпособДоставки).ПриНачалеВыбораИзСписка или НачалоВыбора). Нажмите кнопку открытия модуля (лупа) рядом с ним, чтобы создать или модифицировать обработчик в расширении.СписокВыбора, как показано в предыдущем примере.В некоторых, менее распространенных случаях, для поля, связанного с перечислением, в свойствах самого элемента формы (в режиме конфигуратора) может быть установлен ограниченный список выбора. В этом случае, даже если перечисление расширено, на форме будут видны только те значения, которые явно указаны в этом списке на вкладке "Данные" в свойстве "Список выбора" элемента формы.
Для проверки и решения этой проблемы:
После любых изменений в расширениях, а также при работе с метаданными, система 1С может некорректно отображать новые данные из-за устаревшего кэша. Очистка кэша 1С — это стандартный и часто необходимый шаг для решения многих проблем, связанных с обновлением конфигурации или расширений.
Как очистить кэш:
%USERPROFILE%\AppData\Roaming\1C\1CE\%USERPROFILE%\AppData\Local\1C\1CE\В типовой конфигурации УТ11 поле "Способ доставки" является ключевым элементом логистики и тесно связано с бизнес-процессами. Вполне естественно, что для него могут быть предусмотрены свои особенности заполнения и отборы. Как упоминалось в сообщении на форуме, способы доставки могут делиться на те, которые относятся к "мы им" (реализация) и "они нам" (поступление).
Например, для документа "Заказ клиента" (который чаще всего относится к отгрузке) могут быть актуальны только способы доставки, связанные с вывозом или передачей товара клиенту. Способы, связанные с приемом товара (например, "Доставка от поставщика", если такое значение существует), могут быть исключены из списка выбора программно.
Если вы добавили значение перечисления, которое по своей логике не соответствует типу операции документа (например, добавили "Самовывоз поставщиком" в перечисление, но пытаетесь использовать его в "Заказе клиента" для отгрузки), то типовой код может его автоматически отфильтровывать. В таком случае, при доработке кода в расширении, вам следует учитывать эту типовую логику и, если необходимо, явно разрешить отображение вашего значения, даже если оно изначально могло быть отфильтровано.
Для решения проблемы с неотображением значений перечисления, добавленных в расширении, рекомендуем следующий комплексный подход:
Перечисления.СпособыДоставки) и проверьте наличие процедуры ОбработкаПолученияДанныхВыбора().Документы.ЗаказКлиента.ФормаДокумента) и найдите элемент управления, соответствующий полю "Способ доставки". Изучите его свойства на предмет наличия фиксированного "Списка выбора".ПриНачалеВыбораИзСписка(), НачалоВыбора()) на наличие кода, формирующего или фильтрующего список.Следуя этим шагам, вы сможете точно определить причину проблемы и корректно интегрировать новые значения перечислений из расширения в функционал вашей конфигурации УТ11.