В процессе сопровождения типовых конфигураций, таких как 1С:Бухгалтерия предприятия 3.0, часто возникает задача автоматизации процессов, которые не предусмотрены стандартной логикой программы. Например, создание документа ПеремещениеТоваров на основании РеализацияТоваровУслуг. Основная сложность заключается в требовании сохранить конфигурацию на полной поддержке (не меняя её), сохранив при этом возможность быстро находить связанные документы с помощью запросов.
Разберем подробно, почему стандартные методы (манипуляции с номерами или комментариями) могут не подойти и как реализовать надежную связь через механизм Дополнительных сведений.
Первое, что часто пробуют разработчики — это «зашивать» номер документа-основания в номер подчиненного документа. Рассмотрим, почему это плохой путь:
Перемещение.Номер = "ПР-" + Сред(Реализация.Номер, 1, 5)... велик шанс получить номер, который уже существует в базе, что вызовет ошибку при записи.ПОДСТРОКА работают медленно и не позволяют использовать индексы таблиц, что приведет к деградации производительности при росте базы.Наиболее правильным и «чистым» способом связки объектов в 1С без изменения конфигурации является использование регистра сведений ДополнительныеСведения. Этот механизм входит в состав Библиотеки Стандартных Подсистем (БСП) и доступен практически во всех современных конфигурациях.
Преимущества этого метода:
ДокументСсылка), а не их строковые представления.Прежде чем писать код во внешней обработке, необходимо создать само «свойство», которое будет хранить связь. Проанализируем, как это сделать:
Перемещение товаров и добавим новое свойство.Документ ссылка: Реализация товаров и услуг.Теперь у документа ПеремещениеТоваров появилось скрытое поле, в которое можно записать ссылку на реализацию.
При создании перемещения во внешней обработке нам нужно не только заполнить реквизиты документа, но и создать запись в регистре сведений. Рассмотрим пример кода:
// Предположим, ОбъектПеремещение — это созданный и записанный документ ПеремещениеТоваров
// СсылкаНаРеализацию — это документ-основание РеализацияТоваровУслуг
МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ОбъектПеремещение.Ссылка;
// Укажите ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения, созданный на Шаге 1
МенеджерЗаписи.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ДокументОснование_Реализация");
МенеджерЗаписи.Значение = СсылкаНаРеализацию;
МенеджерЗаписи.Записать();
Важный нюанс: Свойство лучше искать не по наименованию, а заранее создать его программно или искать по уникальному идентификатору, чтобы избежать ошибок при переименовании пользователем.
Теперь проанализируем, как быстро вытянуть все перемещения, созданные на основании конкретной реализации. Благодаря тому, что данные хранятся в индексированном регистре, запрос будет работать мгновенно.
ВЫБРАТЬ
Реализация.Ссылка КАК Реализация,
Перемещение.Ссылка КАК Перемещение
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСведения
ПО ДопСведения.Значение = Реализация.Ссылка
И ДопСведения.Свойство = &СвойствоСвязи
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров КАК Перемещение
ПО ДопСведения.Объект = Перемещение.Ссылка
ГДЕ
Реализация.Ссылка В (&МассивРеализаций)
В данном запросе &СвойствоСвязи — это ссылка на элемент плана видов характеристик, который мы создали ранее.
Если по каким-то причинам использование дополнительных сведений невозможно, рассмотрим вариант с полем Комментарий. Однако, чтобы запрос работал корректно с полем неограниченной длины, нужно соблюдать правило: идентификатор должен быть в начале строки.
Пример записи идентификатора:
Перемещение.Комментарий = "[ID:" + Реализация.УникальныйИдентификатор() + "] " + СтандартныйКомментарий;
Для поиска в запросе используем функцию ВЫРАЗИТЬ, которая позволяет превратить поле неограниченной длины в индексируемую строку (до 1000 символов в 1С):
ВЫБРАТЬ
Перемещение.Ссылка
ИЗ
Документ.ПеремещениеТоваров КАК Перемещение
ГДЕ
ВЫРАЗИТЬ(Перемещение.Комментарий КАК СТРОКА(100)) ПОДОБНО "[ID:" + &СтрокаУИД + "]%"
Однако помните, что поиск по подстроке (ПОДОБНО) всегда медленнее, чем прямое соединение по ссылке в регистре сведений.
Еще один продвинутый способ — использовать системный регистр РегистрСведений.СоответствияОбъектовИнформационныхБаз. Несмотря на то, что он предназначен для обменов, программно в него можно записать любую пару объектов.
Это позволит не создавать новые элементы в ПланахВидовХарактеристик, но требует осторожности, чтобы не нарушить работу типовых механизмов синхронизации данных, если они используются в вашей базе.
Мы проанализировали несколько подходов к связке документов. Наиболее рекомендуемым для 1С:Бухгалтерия 3.0 является метод с Дополнительными сведениями. Он полностью соответствует стандартам разработки фирмы 1С, не требует изменения конфигурации и обеспечивает высокую скорость работы отчетов и запросов.