Обработка данных в 1С 8.3: от файла загрузки до запуска по расписанию
Содержание
Чтобы настроить обработку в 1С, создайте внешнюю обработку
(.epf) в Конфигураторе, добавьте в модуль объекта функцию СведенияОВнешнейОбработке() и подключите файл в разделе Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. После регистрации обработку можно запускать из меню, давать доступ отдельным пользователям и ставить на расписание.
Механизм общий для платформы 8.3 и типовых конфигураций на библиотеке стандартных подсистем: БП 3.0, ЗУП 3.1, УТ 11. Различаются только пути меню. Загрузка, выгрузка и обмен файлами строятся по одной схеме: прочитать файл, сопоставить данные с объектами базы, записать в транзакции, сохранить протокол.
Что выбрать: встроенный механизм, внешняя обработка или расширение
Не каждую задачу обработки данных нужно решать кодом. Сначала проверьте, нет ли готового механизма.
| Инструмент | Когда подходит | Ограничения |
|---|---|---|
| Синхронизация данных (типовой обмен) | Обмен между типовыми конфигурациями: УТ ↔ БП, ЗУП → БП | Только поддерживаемые пары конфигураций |
| Загрузка из табличного документа в списках | Разовая загрузка номенклатуры, контрагентов, цен из Excel | Ограниченный набор объектов, сопоставление колонок вручную |
Внешняя обработка (.epf) | Нестандартный формат файла, регулярная загрузка или выгрузка, массовая правка | Нужен программист, работает в безопасном режиме, пока не разрешено иное |
Расширение конфигурации (.cfe) | Нужно встроить логику в документы, формы, регламентные задания | Сложнее в сопровождении при обновлениях |
| Обработка внутри конфигурации | Своя (нетиповая) конфигурация | Снимает типовую конфигурацию с поддержки |
Для типовых БП 3.0, ЗУП 3.1 и УТ 11 почти всегда правильный выбор — внешняя обработка. Она не меняет конфигурацию, обновления ставятся без конфликтов, а файл можно заменить за минуту.
Подготовка окружения
- Включите механизм дополнительных обработок. В разделе печатных форм, отчётов и обработок поставьте флаг «Дополнительные отчеты и обработки».
- Сделайте копию базы для отладки. Первый прогон новой обработки — только на копии.
- Проверьте права. Пользователю, который будет открывать
.epfчерезФайл → Открыть, нужно право «Интерактивное открытие внешних обработок». Для зарегистрированной обработки оно не требуется: достаточно доступа к самой обработке в её карточке. - Определите, где лежит файл с данными: на компьютере пользователя или в папке на сервере 1С. От этого зависит код чтения.
Пути к списку дополнительных обработок:
| Конфигурация | Путь меню |
|---|---|
| Бухгалтерия предприятия 3.0 | Администрирование → Печатные формы, отчеты и обработки |
| Зарплата и управление персоналом 3.1 | Администрирование → Печатные формы, отчеты и обработки |
| Управление торговлей 11 | НСИ и администрирование → Печатные формы, отчеты и обработки |
Создание и регистрация внешней обработки
В Конфигураторе выберите Файл → Новый → Внешняя обработка. Добавьте форму, реквизиты (например, ПутьКФайлу, ТолькоПроверка) и сохраните файл с расширением .epf.
Чтобы обработка регистрировалась в типовой конфигурации, в модуле объекта нужна экспортная функция. Минимальный вариант для глобальной обработки с серверной командой:
Функция СведенияОВнешнейОбработке() Экспорт
Параметры = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
Параметры.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
Параметры.Версия = "1.0";
Параметры.БезопасныйРежим = Истина;
Команда = Параметры.Команды.Добавить();
Команда.Представление = "Загрузить остатки из файла";
Команда.Идентификатор = "ЗагрузкаОстатков";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Истина;
Возврат Параметры;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ЗагрузкаОстатков" Тогда
ЗагрузитьОстатки();
КонецЕсли;
КонецПроцедуры
Тип команды выбирайте по задаче:
- 🖥 Открытие формы — пользователь сам выбирает файл и смотрит результат.
- ⚙️ Вызов серверного метода — работа без формы. Только такие команды можно ставить на расписание.
- 🔁 Вызов клиентского метода — нужен доступ к файлам на компьютере пользователя без формы.
Регистрация: откройте список дополнительных обработок, нажмите «Добавить из файла», выберите .epf. В карточке укажите разделы, где команда появится, и пользователей с доступом. Новая версия загружается в ту же карточку через «Загрузить из файла» — ссылки на обработку и настройки сохраняются.
Если поле Версия не меняется, при загрузке новой версии легко перепутать, что сейчас работает в базе. Повышайте номер при каждой правке.
Чтение файлов: кодировки, разделители, Excel и JSON
Главная ловушка: код формы выполняется на клиенте, а запись в базу — на сервере. Файл, выбранный на компьютере пользователя, сервер не видит. Его нужно передать через временное хранилище: на клиенте поместить файл (НачатьПомещениеФайлаНаСервер или аналогичные методы), на сервере получить двоичные данные по адресу и записать во временный файл.
&НаСервере
Функция ВременныйФайлИзХранилища(АдресВХранилище, Расширение)
Данные = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяФайла = ПолучитьИмяВременногоФайла(Расширение);
Данные.Записать(ИмяФайла);
Возврат ИмяФайла;
КонецФункции
После обработки удалите временный файл через УдалитьФайлы(ИмяФайла).
CSV и текстовые файлы
Перед кодом откройте файл в текстовом редакторе и ответьте на три вопроса:
- 🔤 Кодировка. Выгрузки из старых программ и банков часто в
windows-1251, из веб-сервисов — в UTF-8. - ✂️ Разделитель. Точка с запятой, запятая или табуляция.
- 🔢 Числа и даты. Десятичная точка или запятая, формат даты
ДД.ММ.ГГГГилиГГГГ-ММ-ДД.
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку(); // заголовок, пропускаем
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
Поля = СтрРазделить(Строка, ";", Истина);
Если Поля.Количество() >= 3 Тогда
Артикул = СокрЛП(Поля[0]);
Количество = Число(СтрЗаменить(Поля[2], ",", "."));
// поиск номенклатуры по артикулу и запись
КонецЕсли;
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Для файла в windows-1251 замените кодировку на КодировкаТекста.ANSI. Если в тексте «кракозябры», почти всегда дело в кодировке.
Excel (xlsx, xls)
Платформа 8.3 читает Excel в табличный документ без установленного Excel:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла);
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
Цена = ТабДок.Область(НомерСтроки, 3).Текст;
// преобразование и запись
КонецЦикла;
Ячейки читаются как текст. Числа приводите явно, пустые строки в конце листа пропускайте проверкой на пустой артикул.
JSON и XML
Для JSON используйте ЧтениеJSON и функцию ПрочитатьJSON — она вернёт структуру или массив. Для XML — ЧтениеXML; если формат описан XDTO-пакетом, удобнее ФабрикаXDTO.ПрочитатьXML.
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл(ИмяФайла);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Алгоритм обработки: сопоставление и трансформация данных
Загрузка почти всегда идёт в три этапа. Не смешивайте их в одном цикле.
- Разбор. Прочитать файл в таблицу значений: колонки «Артикул», «Наименование», «Количество», «Цена», «НомерСтроки».
- Сопоставление. Найти объекты 1С одним запросом, а не поиском на каждой строке. Передайте таблицу в запрос как параметр, соедините со справочником по артикулу или ИНН.
- Запись. Создавать и изменять объекты только после того, как вся таблица проверена.
Что решить заранее, до написания кода:
- 🆕 Нет объекта в базе — создавать новый или пропускать строку с ошибкой. Для контрагентов и номенклатуры безопаснее пропускать: дубли потом чистить дольше, чем завести вручную.
- 🔁 Повторная загрузка того же файла — обновлять существующий документ по номеру и дате или создавать новый. Без этого правила один и тот же файл, загруженный дважды, задвоит остатки.
- 🧮 Округление — до какого знака округлять цены и количество.
Поиск по коду или наименованию через НайтиПоНаименованию на каждой строке на файле в 10 000 строк даст 10 000 обращений к базе. Один запрос с временной таблицей сделает то же быстрее в разы.
Транзакции и целостность: загрузка без половины данных
Если обработка упала на 600-й строке из 1000, в базе не должно остаться 599 записанных документов без остальных. Для этого запись оборачивают в транзакцию:
НачатьТранзакцию();
Попытка
Для Каждого СтрокаДанных Из ТаблицаЗагрузки Цикл
ЗаписатьСтроку(СтрокаДанных);
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Одна транзакция на весь файл подходит для сотен строк. Для десятков тысяч она держит блокировки долго и мешает остальным пользователям. Тогда пишите пакетами: например, по 500 строк в транзакции, а номер последнего успешного пакета сохраняйте, чтобы продолжить с места остановки.
| Схема | Когда | Риск |
|---|---|---|
| Одна транзакция на файл | До ~1 000 строк, данные связаны между собой | Долгие блокировки на больших файлах |
| Пакеты по N строк | Большие файлы, строки независимы | Частично загруженный файл, нужна дозагрузка |
| Транзакция на каждый объект | Справочники, где ошибка одной строки не влияет на другие | Медленнее, больше записей в журнал |
Режим ОбменДанными.Загрузка = Истина при записи отключает проверки и часть обработчиков объекта. Он ускоряет запись, но документ может не сформировать движения так, как при обычном проведении. Используйте его только если точно знаете, какие обработчики пропускаются.
Внутри транзакции не перехватывайте исключение, чтобы «пропустить плохую строку» и продолжить: после ошибки записи транзакция уже испорчена, и фиксация вызовет новую ошибку. Плохие строки отсекайте на этапе проверки, до НачатьТранзакцию().
Форма обработки: прогресс и диалог с пользователем
Пользователь должен видеть три вещи: что выбрано, что происходит и чем закончилось.
- 📂 Выбор файла — поле с кнопкой выбора и фильтром расширений (
*.xlsx,*.csv). - 👀 Предпросмотр — таблица на форме с разобранными строками и колонкой «Статус» до записи. Пользователь видит, какие строки не сопоставились.
- ✅ Флаг «Только проверка» — прогон без записи в базу. Полезен при первой загрузке нового поставщика.
- 📊 Итог — сколько загружено, сколько пропущено и почему.
Сообщения выводите через Сообщение = Новый СообщениеПользователю, указывая Сообщение.Текст, и вызывайте Сообщение.Сообщить(). Метод Сообщить тоже работает, но не позволяет привязать сообщение к полю формы.
Для коротких операций на клиенте хватает Состояние("Обработано строк: " + Формат(Счетчик, "ЧГ=0"), Процент). Если загрузка идёт дольше минуты, выносите её в фоновое задание: форма не «зависнет», а пользователь сможет закрыть её. В типовых конфигурациях для этого есть модуль ДлительныеОперации библиотеки стандартных подсистем; прогресс из фонового задания передаётся через ДлительныеОперации.СообщитьПрогресс.
Журнал ошибок обработки и разбор сбоев
Сообщения на форме исчезают, когда её закрывают. Для разбора на следующий день пишите в журнал регистрации:
Исключение
ЗаписьЖурналаРегистрации("ЗагрузкаОстатков",
УровеньЖурналаРегистрации.Ошибка, , ,
"Строка " + Формат(НомерСтроки, "ЧГ=0") + ": "
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Своё имя события (ЗагрузкаОстатков) позволяет отфильтровать журнал только по вашей обработке. В БП 3.0 журнал открывается через Администрирование → Обслуживание → Журнал регистрации, фильтр по событию задаётся в отборе.
Что записывать:
- 🟢 начало и конец запуска, имя файла, число строк;
- 🔴 каждую ошибку с номером строки файла и текстом исключения;
- 🟡 предупреждения: пропущенные строки, не найденные объекты.
Кроме журнала полезен отдельный протокол для пользователя: таблица «строка → результат», которую можно сохранить в Excel и отправить поставщику данных.
Запуск обработки по расписанию
Регулярная загрузка (курсы, прайсы поставщика, заказы из интернет-магазина) не должна зависеть от того, нажал ли кто-то кнопку.
Через дополнительные обработки (без изменения конфигурации)
- Зарегистрируйте глобальную обработку с командой типа «Вызов серверного метода».
- В карточке обработки, в списке команд, задайте расписание для этой команды: периодичность, время запуска, дни недели.
- Включите использование регламентных заданий, если они отключены в базе.
- Проверьте первый запуск в журнале регистрации по имени своего события.
Такой код работает без пользователя и без формы. Файлы он берёт из папки, доступной серверу 1С (сетевой путь с правами учётной записи, от которой запущена служба), а не с рабочего стола бухгалтера.
В файловой базе регламентные задания выполняются, только пока открыт хотя бы один сеанс клиента. Если ночью базу никто не держит открытой, задание не запустится.
Через командную строку и планировщик Windows
Альтернатива для файловых баз — запуск клиента 1С с параметром /Execute, который открывает внешнюю обработку сразу после входа:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Buh" /N "Робот" /P "пароль" /Execute "D:\Scripts\zagruzka.epf" /C "auto"
Параметр /C передаёт строку в обработку, её читают через ПараметрЗапуска. Например, при значении auto обработка сама выполняет загрузку и завершает сеанс через ЗавершитьРаботуСистемы(Ложь). Задачу создайте в планировщике заданий Windows под отдельной учётной записью.
Не храните пароль администратора в bat-файле. Заведите отдельного пользователя 1С с правами только на нужную загрузку.