Почему новые значения перечисления, добавленные в расширении, не отображаются в документе "Заказ клиента" (УТ11)?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Давайте вместе выясним причины и рассмотрим пошаговые решения, которые помогут вам корректно отобразить добавленные в расширении значения перечисления в пользовательском интерфейсе.

Основная причина: Динамическое формирование списка выбора

Одной из наиболее частых причин, по которой новые значения перечисления не отображаются в выпадающем списке формы, является то, что стандартные элементы форм или программный код конфигурации могут ограничивать или динамически формировать список выбора для этого поля. Это означает, что даже если вы успешно добавили новое значение в перечисление через расширение, форма может просто "не знать" о нем, если список формируется не автоматически из метаданных, а программно.

Рассмотрим, где чаще всего встречается такое динамическое формирование списка:

  1. В процедуре ОбработкаПолученияДанныхВыбора() модуля менеджера перечисления.

    Если в модуле менеджера вашего перечисления (например, Перечисления.СпособыДоставки) существует экспортная процедура ОбработкаПолученияДанныхВыбора(), то она, скорее всего, отвечает за формирование списка значений, которые будут предложены пользователю. В этой процедуре могут быть жестко заданы конкретные значения или применены сложные фильтры, исключающие определенные элементы. Если ваше новое значение не учтено в логике этой процедуры, оно не появится в списке.

    Для примера, типовой код может выглядеть так:

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

    В этом случае, чтобы ваше новое значение отобразилось, вам потребуется заимствовать этот модуль менеджера в расширение и доработать данную процедуру, добавив в СписокЗначений ваше новое значение.

  2. В обработчиках событий формы, таких как ПриНачалеВыбораИзСписка() или ПриНачалеВыбора().

    Аналогично, код, формирующий список выбора, может находиться непосредственно в модуле формы документа (например, ФормаДокумента.ЗаказКлиента) в обработчиках событий элемента формы, связанного с перечислением. Например, в процедуре СпособДоставкиПриНачалеВыбораИзСписка() или СпособДоставкиНачалоВыбора().

    Пример кода:

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

    В этом случае вам потребуется заимствовать форму документа в расширение, а затем заимствовать и доработать соответствующий обработчик события, включив в него ваше новое значение перечисления.

Необходимость заимствования форм и модулей в расширении

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

  1. Заимствование модуля менеджера перечисления.

    Если проблема заключается в процедуре ОбработкаПолученияДанныхВыбора() в модуле менеджера перечисления, вам следует добавить это перечисление в расширение с флагом "Заимствовать". После этого откройте модуль менеджера перечисления в расширении и внесите необходимые изменения. Важно убедиться, что ваша доработка учитывает и стандартные значения, и ваши новые.

    Шаги:

    1. Откройте конфигуратор.
    2. Откройте ваше расширение.
    3. В дереве объектов расширения перейдите к разделу "Перечисления".
    4. Правой кнопкой мыши выберите "Добавить" -> "Существующее перечисление".
    5. Найдите и выберите ваше перечисление (например, СпособыДоставки). Установите флаг "Заимствовать" для него.
    6. Откройте модуль менеджера заимствованного перечисления в расширении и найдите процедуру ОбработкаПолученияДанныхВыбора().
    7. Дополните список значений вашими новыми элементами. Например:
    8. 
      // В заимствованном модуле менеджера перечисления "СпособыДоставки" в расширении
      Процедура ОбработкаПолученияДанныхВыбора(ПараметрыВыбора, СтандартнаяОбработка) Экспорт
          // Вызываем стандартную обработку, если это возможно,
          // или полностью переопределяем, добавляя свои значения.
          // Допустим, мы хотим добавить наше значение к уже существующему списку.
          СтандартнаяОбработка = Истина; // Позволяем стандартной логике отработать
          СуществующийСписок = ПараметрыВыбора.Получить("СписокВыбора");
          Если СуществующийСписок <> Неопределено Тогда
              // Добавляем наше новое значение
              СуществующийСписок.Добавить(Перечисления.СпособыДоставки.НовыйСпособИзРасширения, "Новый способ из расширения");
          Иначе
              // Если стандартная обработка не сформировала список, создаем его сами.
              СписокЗначений = Новый СписокЗначений;
              СписокЗначений.Добавить(Перечисления.СпособыДоставки.Самовывоз, "Самовывоз");
              СписокЗначений.Добавить(Перечисления.СпособыДоставки.ДоКлиента, "До клиента");
              СписокЗначений.Добавить(Перечисления.СпособыДоставки.НовыйСпособИзРасширения, "Новый способ из расширения");
              ПараметрыВыбора.Установить("СписокВыбора", СписокЗначений);
              СтандартнаяОбработка = Ложь; // Отменяем стандартную обработку, если мы ее полностью переопределили
          КонецЕсли;
      КонецПроцедуры
      
  2. Заимствование формы документа и обработчиков событий.

    Если логика формирования списка находится непосредственно в форме документа, вам необходимо заимствовать эту форму в ваше расширение.

    Шаги:

    1. Откройте конфигуратор.
    2. Откройте ваше расширение.
    3. В дереве объектов расширения перейдите к разделу "Документы" -> "Заказ клиента".
    4. Правой кнопкой мыши выберите "Добавить" -> "Формы" -> "Форма документа" (или другую форму, которая содержит нужное поле). Установите флаг "Заимствовать" для этой формы.
    5. Откройте заимствованную форму в расширении.
    6. В дереве элементов формы найдите поле, связанное с перечислением (например, СпособДоставки).
    7. В свойствах этого элемента на вкладке "События" найдите нужный обработчик (например, ПриНачалеВыбораИзСписка или НачалоВыбора). Нажмите кнопку открытия модуля (лупа) рядом с ним, чтобы создать или модифицировать обработчик в расширении.
    8. Доработайте код обработчика, добавив ваше новое значение перечисления в формируемый СписокВыбора, как показано в предыдущем примере.

Ограничение списка выбора в свойствах элемента формы

В некоторых, менее распространенных случаях, для поля, связанного с перечислением, в свойствах самого элемента формы (в режиме конфигуратора) может быть установлен ограниченный список выбора. В этом случае, даже если перечисление расширено, на форме будут видны только те значения, которые явно указаны в этом списке на вкладке "Данные" в свойстве "Список выбора" элемента формы.

Для проверки и решения этой проблемы:

  1. Заимствуйте форму документа в расширение (как описано выше).
  2. Откройте заимствованную форму в конфигураторе.
  3. Выделите элемент формы, связанный с полем "Способ доставки".
  4. Перейдите на вкладку "Данные" в окне свойств элемента.
  5. Найдите свойство "Список выбора". Если оно заполнено, и в нем нет вашего значения, вам потребуется редактировать этот список в расширении, добавив в него ваше новое значение перечисления.
  6. Однако, если список формируется программно, как описано выше, изменение этого свойства может быть недостаточно, и программный код все равно будет переопределять его. Поэтому всегда в первую очередь проверяйте программный код.

Очистка кэша

После любых изменений в расширениях, а также при работе с метаданными, система 1С может некорректно отображать новые данные из-за устаревшего кэша. Очистка кэша 1С — это стандартный и часто необходимый шаг для решения многих проблем, связанных с обновлением конфигурации или расширений.

Как очистить кэш:

  1. Закройте все открытые сеансы 1С:Предприятия.
  2. Запустите 1С:Предприятие в режиме выбора информационной базы (стартовое окно).
  3. Выделите нужную информационную базу.
  4. Нажмите кнопку "Изменить".
  5. Нажмите "Далее", пока не дойдете до последнего шага.
  6. На последнем шаге снимите флаг "Использовать режим совместимости" (если он установлен) или просто нажмите "Готово". Это принудительно обновит кэш.
  7. Альтернативный способ: вручную удалить каталоги кэша. Они обычно находятся в каталогах:
    • %USERPROFILE%\AppData\Roaming\1C\1CE\
    • %USERPROFILE%\AppData\Local\1C\1CE\
    Удалите подкаталоги, имена которых состоят из длинных комбинаций букв и цифр.
  8. Перезапустите 1С:Предприятие и проверьте результат.

Специфика поля "Способ доставки" в УТ11

В типовой конфигурации УТ11 поле "Способ доставки" является ключевым элементом логистики и тесно связано с бизнес-процессами. Вполне естественно, что для него могут быть предусмотрены свои особенности заполнения и отборы. Как упоминалось в сообщении на форуме, способы доставки могут делиться на те, которые относятся к "мы им" (реализация) и "они нам" (поступление).

Например, для документа "Заказ клиента" (который чаще всего относится к отгрузке) могут быть актуальны только способы доставки, связанные с вывозом или передачей товара клиенту. Способы, связанные с приемом товара (например, "Доставка от поставщика", если такое значение существует), могут быть исключены из списка выбора программно.

Если вы добавили значение перечисления, которое по своей логике не соответствует типу операции документа (например, добавили "Самовывоз поставщиком" в перечисление, но пытаетесь использовать его в "Заказе клиента" для отгрузки), то типовой код может его автоматически отфильтровывать. В таком случае, при доработке кода в расширении, вам следует учитывать эту типовую логику и, если необходимо, явно разрешить отображение вашего значения, даже если оно изначально могло быть отфильтровано.

Резюме и пошаговый план действий

Для решения проблемы с неотображением значений перечисления, добавленных в расширении, рекомендуем следующий комплексный подход:

  1. Исследование кода:
    • Откройте конфигурацию в режиме отладки или конфигураторе.
    • Найдите модуль менеджера перечисления (например, Перечисления.СпособыДоставки) и проверьте наличие процедуры ОбработкаПолученияДанныхВыбора().
    • Откройте форму документа (Документы.ЗаказКлиента.ФормаДокумента) и найдите элемент управления, соответствующий полю "Способ доставки". Изучите его свойства на предмет наличия фиксированного "Списка выбора".
    • Проверьте обработчики событий этого элемента (например, ПриНачалеВыбораИзСписка(), НачалоВыбора()) на наличие кода, формирующего или фильтрующего список.
  2. Заимствование и доработка в расширении:
    • В зависимости от того, где вы нашли логику формирования списка, заимствуйте соответствующий объект в ваше расширение (модуль менеджера перечисления или форму документа вместе с её обработчиками).
    • Доработайте программный код таким образом, чтобы он включал ваше новое значение перечисления в формируемый список выбора. Убедитесь, что вы не нарушаете существующую логику, а лишь дополняете её.
  3. Очистка кэша:
    • После внесения всех изменений обязательно очистите кэш 1С:Предприятия.
  4. Тестирование:
    • Запустите 1С:Предприятие в пользовательском режиме и проверьте, появилось ли ваше новое значение перечисления в выпадающем списке поля "Способ доставки" в документе "Заказ клиента".

Следуя этим шагам, вы сможете точно определить причину проблемы и корректно интегрировать новые значения перечислений из расширения в функционал вашей конфигурации УТ11.

← На главную