Где находится исполняемый код команды Создать на основании в УТ 11.4 в документе Заказ клиента

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

Механизм создания одних документов на основании других является одной из ключевых функций платформы 1С:Предприятие 8.3. Однако в современных конфигурациях, таких как Управление торговлей 11.4 (УТ 11.4), поиск конкретного участка кода может вызвать затруднения из-за сложной архитектуры и использования подсистемы «Библиотека стандартных подсистем» (БСП). В этой статье мы подробно разберем, где именно «прячется» логика заполнения и как работает этот механизм изнутри.

Главное правило: Ищите в целевом документе

Разберем типичную ситуацию: вы находитесь в форме документа ЗаказКлиента и нажимаете кнопку Создать на основании, выбирая, например, РеализацияТоваровУслуг. Первая и самая распространенная ошибка — искать код в модуле документа-основания (в нашем случае — Заказа). Проанализируем логику платформы: за создание и заполнение «нового» объекта отвечает сам этот объект. Следовательно, исполняемый код всегда находится в модуле объекта того документа, который создается.

Рассмотрим пошагово, как найти нужную процедуру:

  1. Откройте конфигуратор и найдите документ, который вы хотите создать (например, РеализацияТоваровУслуг).
  2. Нажмите правой кнопкой мыши на документ и выберите Открыть модуль объекта.
  3. Найдите в списке процедур (через Ctrl + F или выпадающий список) стандартный обработчик ОбработкаЗаполнения.

Именно эта процедура является «точкой входа» при создании документа на основании. Рассмотрим пример кода, который обычно там содержится:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
		// Логика заполнения из Заказа клиента
		ЗаполнитьПоЗаказуКлиента(ДанныеЗаполнения);
	КонецЕсли;
	
КонецПроцедуры

Архитектура УТ 11.4: Вынос логики в общие модули

Проанализируем ситуацию глубже. В конфигурациях на базе ERP 2.0 (к которым относится УТ 11.4) разработчики фирмы «1С» стараются не перегружать модули объектов кодом. Поэтому, открыв процедуру ОбработкаЗаполнения, вы, скорее всего, увидите вызов другой процедуры, которая может находиться в Модуле менеджера этого же документа или в специализированном Общем модуле.

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

Рассмотрим наиболее вероятные места нахождения логики для УТ 11.4:

Механизм подключаемых команд

Посмотрим на ситуацию с точки зрения интерфейса. В форме документа ЗаказКлиента список команд «Создать на основании» часто формируется динамически. За это отвечает подсистема БСП «Подключаемые команды». Проанализируем, как это работает:

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

Проверка настроек метаданных

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

  1. Перейдите к целевому документу (например, РеализацияТоваровУслуг).
  2. Откройте вкладку Ввод на основании.
  3. В поле Является основанием для (внизу) вы увидите список документов, на основании которых можно создать текущий. Проверьте, стоит ли там галочка напротив ЗаказКлиента.
  4. Также можно воспользоваться Конструктором ввода на основании, чтобы увидеть, какие поля сопоставлены платформой автоматически.

Важный нюанс: Если в этом списке связь отсутствует, платформа не передаст данные в параметр ДанныеЗаполнения, и ваш код в ОбработкаЗаполнения не сработает должным образом.

Анализ параметра ДанныеЗаполнения

Выясним, что именно попадает в код при нажатии кнопки. В переменную ДанныеЗаполнения может прийти:

Пример корректной обработки различных типов входных данных:


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

Как изменить логику без снятия с поддержки

Если ваша задача — не просто найти код, а изменить его (например, добавить заполнение дополнительного реквизита), мы рекомендуем использовать Расширения конфигурации. Рассмотрим, как это сделать правильно:

  1. Создайте новое расширение.
  2. Добавьте в него целевой документ (например, РеализацияТоваровУслуг).
  3. В модуле объекта документа в расширении создайте метод-перехватчик для ОбработкаЗаполнения.

Используйте аннотацию &После, чтобы дополнить типовое заполнение своими данными:


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

Резюмируем: Поиск исполняемого кода «Создать на основании» всегда начинается с модуля объекта создаваемого документа. Помните о сложной иерархии вызовов в УТ 11.4 и всегда проверяйте настройки метаданных на вкладке «Ввод на основании», чтобы убедиться в наличии связи между объектами.

← На главную