Как реализовать ввод документа на основании и обеспечить автоматическое заполнение данных в 1С

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

В процессе разработки конфигураций на платформе 1С:Предприятие 8 одна из наиболее часто встречающихся задач — это настройка взаимосвязи между документами. Типичный пример: создание документа ВозвратКниг на основании ВыдачаКниг. В этой статье мы подробно разберем, как правильно реализовать этот механизм, обеспечить автоматическое заполнение полей и гарантировать логическую целостность данных в системе.

Механизм «Ввод на основании» и процедура ОбработкаЗаполнения

Для начала проанализируем, как платформа инициирует создание одного документа из другого. Основным инструментом программиста здесь выступает обработчик события ОбработкаЗаполнения, расположенный в модуле объекта создаваемого документа (в нашем случае — ВозвратКниг).

Разберем по шагам, как это работает. Когда пользователь нажимает кнопку «Создать на основании», система создает новый экземпляр объекта и вызывает этот обработчик, передавая в него ссылку на документ-источник в параметре ДанныеЗаполнения (или Основание в зависимости от версии и контекста).

Рассмотрим пример кода, который необходимо разместить в модуле документа ВозвратКниг:


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

Обратите внимание на использование функции ТипЗнч(). Это критически важный момент, так как у одного документа может быть несколько потенциальных оснований. Хорошим тоном считается явная проверка типа, чтобы избежать ошибок при попытке обращения к реквизитам, которых нет у другого типа объекта.

Обеспечение обязательности связи документов

Часто возникает требование: документ ВозвратКниг не должен быть проведен, если не указан документ ВыдачаКниг. Чтобы реализовать это ограничение, проанализируем возможности платформы. Самый простой и правильный путь — использование свойства Проверка заполнения.

  1. Откройте конфигуратор и найдите реквизит ДокументОснование в документе ВозвратКниг.
  2. В палитре свойств установите значение «Выдавать ошибку» для параметра «Проверка заполнения».

После этой настройки платформа автоматически будет блокировать проведение (и запись, если настроено), если поле пустое. Однако, если нам нужна более сложная логика — например, проверка того, что книги действительно числятся за этим читателем по данному основанию — нам потребуется обратиться к обработчику ОбработкаПроверкиЗаполнения или ПередЗаписью.

Использование регистров накопления для контроля остатков

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

Выясним причину, почему это лучше: если мы будем использовать только данные документа-основания, мы рискуем «вернуть» книгу, которую читатель уже вернул ранее другим документом. Чтобы этого избежать, при выборе основания в форме документа ВозвратКниг, мы должны выполнить запрос к регистру.

Рассмотрим пример логики подбора остатков:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КнигиНаРукахОстатки.Книга КАК Книга,
    |	КнигиНаРукахОстатки.КоличествоОстаток КАК Количество
    |ИЗ
    |	РегистрНакопления.КнигиНаРуках.Остатки(, Читатель = &Читатель И ДокументВыдачи = &Основание) КАК КнигиНаРукахОстатки";

Запрос.УстановитьПараметр("Читатель", ЭтотОбъект.Читатель);
Запрос.УстановитьПараметр("Основание", ЭтотОбъект.ДокументОснование);

РезультатЗапроса = Запрос.Выполнить();
// Далее следует заполнение табличной части результатами запроса

Партионный учет в контексте документов-оснований

В системе 1С привязка возврата к конкретной выдаче — это классический пример партионного учета. Здесь документ ВыдачаКниг выступает в роли «партии». Это позволяет системе точно знать, какой именно «долг» закрывается. Это особенно важно, если одна и та же книга выдавалась одному и тому же человеку несколько раз в разное время.

Для реализации такой схемы в регистре накопления КнигиНаРуках необходимо добавить измерение ДокументВыдачи с типом ссылки на ДокументСсылка.ВыдачаКниг. Тогда при проведении возврата мы будем делать движение «Расход», указывая это измерение. Это обеспечит идеальную сходимость остатков в разрезе каждой конкретной выдачи.

Критерии отбора и структура подчиненности

Чтобы пользователю было удобно отслеживать цепочки документов, проанализируем механизм Критериев отбора. В конфигурации обычно создается критерий отбора «СвязанныеДокументы». Если включить в него состав реквизитов, указывающих на основание, то в интерфейсе автоматически появится кнопка «Структура подчиненности».

Это позволит библиотекарю в один клик увидеть:

Автоматизация через расширения (современный подход)

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

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

← На главную