Как добавить кнопку на документ Заказ покупателя для автоматического сбора файлов номенклатуры в папку заказа

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

В производственных процессах часто возникает необходимость оперативного доступа к технической документации, чертежам или формулам, привязанным к конкретным позициям номенклатуры в заказе. Чтобы исключить ручной поиск файлов рабочими, мы можем автоматизировать процесс сбора всех документов, относящихся к заказу, и их выгрузку в отдельную папку на диске. Рассмотрим подробнее, как реализовать этот функционал с помощью расширения конфигурации и программных средств 1С.

Постановка задачи и выбор способа реализации

Наша цель — добавить кнопку в документ ЗаказПокупателя (в современных конфигурациях — ЗаказКлиента), которая при нажатии будет выполнять следующие действия:

  1. Анализировать табличную часть заказа и находить всю номенклатуру.
  2. Извлекать файлы, прикрепленные к каждой позиции номенклатуры.
  3. Создавать на диске новую папку, имя которой соответствует номеру заказа.
  4. Копировать все найденные файлы в эту папку.

Наиболее корректным способом внесения таких изменений является использование расширения конфигурации. Это позволит сохранить основную конфигурацию на поддержке и обеспечит легкость обновления системы.

Шаг 1: Добавление кнопки на форму документа

Для начала создадим расширение и добавим в него форму документа ЗаказПокупателя. Разберем по шагам создание команды:

  1. В дереве объектов расширения найдем нужную форму и откроем ее конструктор.
  2. Перейдем на вкладку "Команды" и создадим новую команду, например, ВыгрузитьФайлыДляПроизводства.
  3. Перетащим созданную команду на панель инструментов формы или в удобное место в командном интерфейсе.
  4. В свойствах команды создадим обработчик действия на клиенте и на сервере.

Шаг 2: Программное создание каталога

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


// Функция создает папку заказа в указанном сетевом каталоге
&НаСервере
Процедура СоздатьПапкуЗаказаНаСервере(НомерЗаказа)
    ПутьКХранилищу = "C:\ProductionFiles\"; // Рекомендуется вынести в настройки
    ИмяПапки = ПутьКХранилищу + "Заказ_" + СтрЗаменить(НомерЗаказа, "/", "_");
    
    Если Не ФайлСуществует(ИмяПапки) Тогда
        СоздатьКаталог(ИмяПапки);
    КонецЕсли;
КонецПроцедуры

Важный нюанс: при работе в клиент-серверном варианте код создания каталога должен выполняться на стороне сервера, и у учетной записи, под которой запущена служба 1С, должны быть права на запись в целевую директорию.

Шаг 3: Получение присоединенных файлов номенклатуры

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


&НаСервере
Процедура СобратьФайлыИзЗаказа(СсылкаНаЗаказ)
    Для Каждого СтрокаТЧ Из СсылкаНаЗаказ.Товары Цикл
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |	НоменклатураПрисоединенныеФайлы.Ссылка КАК ФайлСсылка
            |ИЗ
            |	Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
            |ГДЕ
            |	НоменклатураПрисоединенныеФайлы.ВладелецФайла = &Номенклатура";
        
        Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура);
        Результат = Запрос.Выполнить().Выбрать();
        
        Пока Результат.Следующий() Цикл
            // Используем функционал БСП для получения данных
            ДанныеФайла = РаботаСФайлами.ДанныеФайла(Результат.ФайлСсылка);
            Если ДанныеФайла.ЗначениеЗаполнено() Тогда
                // Логика сохранения двоичных данных в созданный ранее каталог
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Здесь мы используем объект РаботаСФайлами из Библиотеки стандартных подсистем (БСП), что значительно упрощает работу с двоичными данными, так как система сама определяет, где лежит файл: в томах на диске или непосредственно в базе данных.

Шаг 4: Решение проблемы "Общих файлов"

Часто возникает ситуация, когда один и тот же чертеж или схема (например, Контур_80.RD) используется для десятков разных наименований номенклатуры. Если мы прикрепим копию этого файла к каждой позиции, то при изменении чертежа нам придется вручную обновлять его везде. Рассмотрим способы решения этой проблемы:

  1. Использование внешних ссылок: Вместо хранения самого файла в 1С можно хранить путь к нему на сетевом диске (реквизит типа Строка). При нажатии кнопки 1С просто перейдет по указанному пути C:/контуры/круг/Контур_80.RD и скопирует актуальную версию файла в папку заказа.
  2. Единая библиотека файлов: Создадим отдельный справочник БиблиотекаТехническойДокументации. В карточке номенклатуры добавим реквизит-ссылку на элемент этого справочника. Таким образом, файл хранится в одном месте, и при его обновлении изменения автоматически подхватятся всеми связанными заказами.

Шаг 5: Оптимизация работы в веб-клиенте

Если ваши пользователи работают через браузер, прямая команда СоздатьКаталог на диске C: может не сработать из-за политик безопасности. В таком случае разберем по шагам альтернативный подход:

Резюмируем: Реализация кнопки выгрузки файлов требует понимания структуры справочников присоединенных файлов и навыков работы с файловой системой. Использование расширений и механизмов БСП позволяет сделать это решение надежным и удобным для поддержки. Для долгосрочной работы производства наиболее эффективным методом будет организация единой библиотеки чертежей, что исключит дублирование и ошибки при обновлении документации.

← На главную