В процессе разработки конфигураций на платформе 1С:Предприятие 8 одна из наиболее часто встречающихся задач — это настройка взаимосвязи между документами. Типичный пример: создание документа ВозвратКниг на основании ВыдачаКниг. В этой статье мы подробно разберем, как правильно реализовать этот механизм, обеспечить автоматическое заполнение полей и гарантировать логическую целостность данных в системе.
Для начала проанализируем, как платформа инициирует создание одного документа из другого. Основным инструментом программиста здесь выступает обработчик события ОбработкаЗаполнения, расположенный в модуле объекта создаваемого документа (в нашем случае — ВозвратКниг).
Разберем по шагам, как это работает. Когда пользователь нажимает кнопку «Создать на основании», система создает новый экземпляр объекта и вызывает этот обработчик, передавая в него ссылку на документ-источник в параметре ДанныеЗаполнения (или Основание в зависимости от версии и контекста).
Рассмотрим пример кода, который необходимо разместить в модуле документа ВозвратКниг:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// Проверяем, что основанием является именно документ ВыдачаКниг
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ВыдачаКниг") Тогда
// Заполняем основные реквизиты шапки
ЭтотОбъект.ДокументОснование = ДанныеЗаполнения;
ЭтотОбъект.Читатель = ДанныеЗаполнения.Читатель;
// Переносим данные из табличной части документа-основания
Для Каждого СтрокаВыдачи Из ДанныеЗаполнения.СписокКниг Цикл
НоваяСтрока = ЭтотОбъект.СписокКниг.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаВыдачи);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Обратите внимание на использование функции ТипЗнч(). Это критически важный момент, так как у одного документа может быть несколько потенциальных оснований. Хорошим тоном считается явная проверка типа, чтобы избежать ошибок при попытке обращения к реквизитам, которых нет у другого типа объекта.
Часто возникает требование: документ ВозвратКниг не должен быть проведен, если не указан документ ВыдачаКниг. Чтобы реализовать это ограничение, проанализируем возможности платформы. Самый простой и правильный путь — использование свойства Проверка заполнения.
ДокументОснование в документе ВозвратКниг.После этой настройки платформа автоматически будет блокировать проведение (и запись, если настроено), если поле пустое. Однако, если нам нужна более сложная логика — например, проверка того, что книги действительно числятся за этим читателем по данному основанию — нам потребуется обратиться к обработчику ОбработкаПроверкиЗаполнения или ПередЗаписью.
Как справедливо отмечалось в обсуждении, простая копия данных из одного документа в другой не всегда эффективна. В реальной библиотеке читатель может вернуть только часть книг. Поэтому логичнее строить заполнение не просто по документу, а по актуальным остаткам в регистре накопления (например, КнигиНаРуках).
Выясним причину, почему это лучше: если мы будем использовать только данные документа-основания, мы рискуем «вернуть» книгу, которую читатель уже вернул ранее другим документом. Чтобы этого избежать, при выборе основания в форме документа ВозвратКниг, мы должны выполнить запрос к регистру.
Рассмотрим пример логики подбора остатков:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КнигиНаРукахОстатки.Книга КАК Книга,
| КнигиНаРукахОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.КнигиНаРуках.Остатки(, Читатель = &Читатель И ДокументВыдачи = &Основание) КАК КнигиНаРукахОстатки";
Запрос.УстановитьПараметр("Читатель", ЭтотОбъект.Читатель);
Запрос.УстановитьПараметр("Основание", ЭтотОбъект.ДокументОснование);
РезультатЗапроса = Запрос.Выполнить();
// Далее следует заполнение табличной части результатами запроса
В системе 1С привязка возврата к конкретной выдаче — это классический пример партионного учета. Здесь документ ВыдачаКниг выступает в роли «партии». Это позволяет системе точно знать, какой именно «долг» закрывается. Это особенно важно, если одна и та же книга выдавалась одному и тому же человеку несколько раз в разное время.
Для реализации такой схемы в регистре накопления КнигиНаРуках необходимо добавить измерение ДокументВыдачи с типом ссылки на ДокументСсылка.ВыдачаКниг. Тогда при проведении возврата мы будем делать движение «Расход», указывая это измерение. Это обеспечит идеальную сходимость остатков в разрезе каждой конкретной выдачи.
Чтобы пользователю было удобно отслеживать цепочки документов, проанализируем механизм Критериев отбора. В конфигурации обычно создается критерий отбора «СвязанныеДокументы». Если включить в него состав реквизитов, указывающих на основание, то в интерфейсе автоматически появится кнопка «Структура подчиненности».
Это позволит библиотекарю в один клик увидеть:
Если вы работаете с типовой конфигурацией и не хотите снимать её с поддержки, воспользуйтесь механизмом расширений. Вы можете создать процедуру-обработчик «После» для ОбработкаЗаполнения. Это позволит добавить специфическую логику (например, заполнение текущей даты или ответственного сотрудника), не меняя основной код конфигурации.
Резюмируя: реализация ввода на основании — это не только копирование данных, но и проектирование правильной структуры регистров. Использование процедуры ОбработкаЗаполнения совместно с контролем остатков через регистры накопления позволяет создать надежную и удобную систему учета, которая исключает ошибки «двойного возврата» или потери данных о долгах читателей.