При получении задач по доработке конфигурации «1С:Бухгалтерия предприятия 3.0» начинающие разработчики часто сталкиваются с неочевидной архитектурной особенностью платформы. Получив задание настроить или изменить документ «Передача сырья в переработку», программист открывает конфигуратор, пытается найти его через глобальный поиск или в дереве метаданных, но не обнаруживает объекта с таким именем.
В этой статье мы подробно разберем, почему разработчики фирмы «1С» приняли такое архитектурное решение, в каком объекте метаданных физически хранятся эти документы, как они функционируют и как правильно работать с ними на уровне программного кода.
Для оптимизации структуры базы данных и упрощения поддержки программного кода разработчики типовых решений часто объединяют схожие по структуре хозяйственные операции в рамках одного физического объекта (документа). Это позволяет избежать дублирования одинаковых реквизитов (таких как контрагент, договор, склад, организация, табличная часть с перечнем номенклатуры).
Физической сущностью в конфигураторе для операции передачи давальческого сырья является документ Документ.ПередачаТоваров. Именно он отвечает за регистрацию всех движений по передаче материальных ценностей сторонним контрагентам без перехода права собственности.
Разделение логики проведения, внешнего вида форм и состава печатных форм внутри документа Документ.ПередачаТоваров осуществляется программно в зависимости от значения реквизита ВидОперации.
Рассмотрим структуру этого механизма подробнее:
ВидОперации имеет ссылочный тип данных и указывает на перечисление Перечисление.ВидыОперацийПередачаТоваров.ВПереработку (в кодовой базе это записывается как Перечисления.ВидыОперацийПередачаТоваров.ВПереработку).Выясним, каким образом пользователь видит в интерфейсе разделы «Передача сырья в переработку» и как система понимает, что нужно открыть форму именно с этим набором данных. Для этого в платформе используется механизм общих команд:
ОбщаяКоманда.ПередачаСырьяВПереработку.Документ.ПередачаТоваров.Форма.ФормаСписка, но сразу же применяет жесткий (фиксированный) отбор к динамическому списку формы по условию: ВидОперации = Перечисления.ВидыОперацийПередачаТоваров.ВПереработку.Проанализируем, как система перестраивает форму документа при его создании и редактировании. В самом документе Документ.ПередачаТоваров создана универсальная управляемая форма ФормаДокумента.
При создании нового документа из отфильтрованного списка (например, по кнопке «Создать») в форму передаются параметры автозаполнения. Система автоматически инициализирует реквизит ВидОперации значением ВПереработку.
В процессе открытия на сервере (в обработчике события ПриСозданииНаСервере) выполняется программный анализ текущего вида операции. В зависимости от этого форма динамически меняет свое состояние:
Если перед вами стоит задача разработать отчет по переданному сырью, выполнить пакетную загрузку документов из внешних систем или доработать логику проведения, вам необходимо следовать строгим правилам работы с документом Документ.ПередачаТоваров.
При написании запросов к базе данных вы не сможете обратиться к несуществующей таблице «ПередачаСырьяВПереработку». Вам всегда необходимо выбирать данные из таблицы передач товаров, обязательно накладывая условие на вид операции. Игнорирование этого правила приведет к тому, что в ваш отчет или обработку попадут совершенно другие операции (например, передача тары), что повлечет за собой искажение данных.
Рассмотрим пример правильного построения запроса в конфигураторе:
ВЫБРАТЬ
ПередачаТоваров.Ссылка КАК ДокументСсылка,
ПередачаТоваров.Дата КАК ДатаДокумента,
ПередачаТоваров.Номер КАК НомерДокумента,
ПередачаТоваров.Контрагент КАК Контрагент,
ПередачаТоваров.Склад КАК СкладОтправитель
ИЗ
Документ.ПередачаТоваров КАК ПередачаТоваров
ГДЕ
ПередачаТоваров.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийПередачаТоваров.ВПереработку)
И НЕ ПередачаТоваров.ПометкаУдаления
Если вы разрабатываете интеграцию или обработку по заполнению документов, помните о важности правильной последовательности инициализации реквизитов. Первым делом после создания объекта необходимо установить вид операции, и только после этого вызывать стандартные механизмы заполнения по умолчанию.
Разберем детальный пример программного создания документа передачи сырья в переработку:
// Шаг 1. Создаем объект нового документа
НовыйДокумент = Документы.ПередачаТоваров.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701020304");
// Шаг 2. Заполняем вид операции (это критически важно для работы обработчиков заполнения!)
НовыйДокумент.ВидОперации = Перечисления.ВидыОперацийПередачаТоваров.ВПереработку;
// Шаг 3. Инициализируем заполнение по умолчанию (заполнение счетов учета)
// Это автоматически проставит счет учета (например, 10.01) и счет передачи (10.07)
НовыйДокумент.Заполнить(Неопределено);
// Шаг 4. Наполняем табличную часть материалами
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00000045");
НоваяСтрока.Количество = 150;
// При необходимости перезаписываем счета учета вручную, если это требуется по бизнес-логике
НоваяСтрока.СчетУчета = ПланыСчетов.Хозрасчетный.СырьеИМатериалы;
НоваяСтрока.СчетПередачи = ПланыСчетов.Хозрасчетный.МатериалыПереданныеВПереработку;
// Шаг 5. Записываем и проводим документ в базе данных
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ЗаписьЖурналаРегистрации("ПрограммноеСозданиеДокументов",
УровеньЖурналаРегистрации.Ошибка,
,
,
ОписаниеОшибки());
КонецПопытки;
Понимание этой внутренней логики взаимодействия объектов метаданных позволит вам легко находить нужные фрагменты кода, эффективно использовать стандартные механизмы отборов и успешно решать любые задачи по автоматизации давальческих схем в 1С:Бухгалтерии 3.0.