Присоединенные файлы в документе Сборка товаров (ERP 2.5, КА 2.5, УТ 11.5)
Как устроены присоединённые файлы в конфигурациях 1С:ERP/КА/УТ
Хранение и связь с документом
В типовых решениях используется справочник Файлы (синоним «Присоединённые файлы»). Каждый элемент этого справочника имеет реквизит Владелец типа ПроизвольнаяСсылка, который указывает на объект-владельца – в нашем случае на документ «Сборка товаров». Связь «один ко многим» реализована через прямую ссылку в таблице справочника, а не через отдельный регистр сведений. Это упрощает архитектуру, но создаёт неочевидные последствия при операциях с документами.
Особенности именно для документа «Сборка товаров»
Документ «Сборка товаров» (далее – СТ) часто используется в качестве черновика / производственного задания. После сборки он может быть скопирован для повторного использования, перепроведён корректирующим документом или служить основанием для «Списания товаров» / «Оприходования товаров». Во всех этих случаях стандартный механизм типовой конфигурации не переносит присоединённые файлы автоматически – ссылка на файл остаётся только у исходного документа.
Ключевой тезис: Присоединённые файлы «привязаны» к конкретному экземпляру документа СТ. При копировании или создании на основании система не дублирует записи справочника Файлы для нового документа. Это может привести к полной потере доступа к файлам, если исходный документ будет удалён или модифицирован.
Подводные камни: когда файлы «пропадают»
Копирование документа
Рассмотрим типовой сценарий: специалист создал документ СТ, прикрепил к нему чертёж или спецификацию в формате PDF, провёл документ. Затем понадобилось создать копию для другого заказа. Операция копирования (Ctrl+C / Ctrl+V или программное копирование через Скопировать()) создаёт новый документ с теми же реквизитами, но не копирует записи в справочнике Файлы для нового документа. Прикреплённые файлы остаются у исходного документа. Новый документ будет без файлов, что может остаться незамеченным до момента печати или отправки.
Перепроведение и перезапись
Если документ СТ уже имеет присоединённые файлы, а затем пользователь перепроводит его (например, изменив количество), файлы не теряются – они сохраняют связь с тем же экземпляром. Однако при программном пересоздании документа (например, при обработке «Закрытие заказов на производство») старый документ удаляется, а новый создаётся. В таком случае файлы остаются у удалённого документа и становятся «сиротами». Справочник Файлы хранит ссылку на несуществующий объект, что может вызывать ошибки при попытке открыть файл.
Создание на основании
При вводе на основании документа СТ (например, «Списание товаров») новый объект не получает присоединённые файлы. Хотя с точки зрения бизнес-логики файлы (схемы сборки, инструкции) могли бы быть полезны и в производном документе. Разработчику приходится самостоятельно реализовывать перенос.
Практическое руководство: как обеспечить корректный перенос файлов
Типичные ошибки (и как их избежать)
- Ошибка: Полная уверенность, что копирование документа переносит файлы. Решение: всегда проверять наличие файлов у нового документа после копирования.
- Ошибка: Использование глобальных обработчиков
ПриКопировании()без учёта подсистемы файлов. Решение: добавить специальный код в обработчик. - Ошибка: Хранение файлов только на диске (внешние ссылки) – при перемещении файла ссылка становится недействительной. Решение: загружать файлы в базу (опция «Хранить в информационной базе» справочника
Файлы).
Что делать прямо сейчас: чек-лист для разработчика
- Проверка наличия файлов у документа – написать простой отчёт или обработку для контроля. Пример кода:
// Получение количества присоединённых файлов для документа Сборка товаров
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ КОЛИЧЕСТВО(Файлы.Ссылка)
ИЗ Справочник.Файлы КАК Файлы
ГДЕ Файлы.Владелец = &СсылкаНаДокумент";
Запрос.УстановитьПараметр("СсылкаНаДокумент", Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Выборка.Следующий();
КоличествоФайлов = Выборка[0];
- Копирование файлов при программном создании документа – использовать обработчик
ПриКопировании()события формы или подписку на событиеПередЗаписьюс копированием записей справочника:
// Пример в обработчике "ПриКопировании" формы документа
// НовыйОбъект – скопированный документ
// копируем все файлы исходного документа
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
Возврат; // новый документ без исходника
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Файлы.Ссылка,
| Файлы.Наименование,
| Файлы.Хранилище,
| Файлы.ПредставлениеДанных
|ИЗ
| Справочник.Файлы КАК Файлы
|ГДЕ
| Файлы.Владелец = &ИсходныйДокумент";
Запрос.УстановитьПараметр("ИсходныйДокумент", Объект.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НовыйФайл = Справочники.Файлы.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйФайл, Выборка);
НовыйФайл.Владелец = НовыйОбъект.Ссылка;
НовыйФайл.Записать();
КонецЦикла;
Важное предупреждение: Приведённый код копирует не само содержимое файла, а только ссылку на элемент справочника и хранилище. Если файл хранится в базе, он будет скопирован правильно. Если файл хранится на диске по относительному пути – скопируется только путь, что может привести к битым ссылкам. Всегда используйте режим хранения «В информационной базе» для критичных документов.
Механика под капотом: почему так происходит
Платформа 1С:Предприятие не предоставляет стандартных механизмов для автоматического дублирования записей справочников при копировании документов. Копирование реквизитов (стандартная операция Скопировать()) переносит только те данные, которые являются прямыми реквизитами документа. Справочник Файлы – это самостоятельный объект метаданных, а не табличная часть документа. Поэтому его записи не входят в состав «плоского» копирования. Разработчикам типовых конфигураций пришлось бы переопределять поведение ПриКопировании() на уровне формы или объекта, но этого не сделано для документа СТ (возможно, из соображений производительности).
Проблема не баг, а особенность архитектуры: файлы живут вне документа, и их связь с владельцем – это внешняя ссылка. Ответственность за поддержание актуальности связей ложится на разработчика.
Выводы и рекомендации
- Планируйте использование присоединённых файлов в документах СТ заранее. Определите, нужны ли файлы в копиях и документах-основаниях.
- Если нужны – реализуйте перенос через подписку на событие
ПриКопированииили через обработку массового копирования. - Храните файлы в информационной базе, чтобы избежать проблем с перемещением внешних файлов.
- Периодически проверяйте целостность связей (например, при проведении регламентного задания «Проверка ссылочной целостности»).
Итог: Механизм присоединённых файлов в документе «Сборка товаров» удобен, но без дополнительной разработки может привести к неожиданной потере данных. Понимание внутренней архитектуры и своевременное добавление копирования файлов спасёт от инцидентов в рабочей среде.
Попробовать НОПик →