Внешние обработки в 1С:Предприятие — это мощный инструмент для расширения функциональности системы без изменения основной конфигурации. Они позволяют автоматизировать рутинные операции, добавлять новые отчеты, интегрировать 1С с другими системами и решать узкоспециализированные задачи. Но как правильно написать такую обработку, чтобы она работала стабильно, не конфликтовала с обновлениями платформы и соответствовала стандартам 1С?
Эта статья поможет разобраться во всех нюансах — от выбора типа обработки до отладки и внедрения. Мы рассмотрим не только технические аспекты (синтаксис, модули, события), но и практические советы по оптимизации кода, работе с данными и избежанию типичных ошибок. Особое внимание уделим вопросам безопасности и совместимости с разными версиями платформы 1С:Предприятие 8.3.
Если вы никогда не писали внешние обработки, начните с основ — структуры файла и базовых объектов. Опытные разработчики найдут здесь полезные лайфхаки по ускорению разработки и интеграции с внешними системами. В конце статьи — ответы на частые вопросы и чек-лист для проверки готового решения.
1. Что такое внешняя обработка и зачем она нужна
Внешняя обработка в 1С:Предприятие — это отдельный файл с расширением .epf (или .erf для отчетов), который подключается к базе данных без изменения её конфигурации. Она может содержать:
- 📊 Отчеты — формирование аналитических данных по произвольным алгоритмам
- ⚙️ Обработки документов — массовое изменение данных, загрузка/выгрузка
- 🔗 Интеграционные модули — обмен данными с сайтами, CRM, банками
- 🛠️ Сервисные утилиты — очистка базы, проверка целостности, резервное копирование
Основные преимущества внешних обработок:
- 🔄 Независимость от обновлений — не ломаются при изменении типовой конфигурации
- 📦 Портативность — один файл можно использовать в разных базах
- 🛡️ Безопасность — нет риска повредить основную конфигурацию
- 🚀 Гибкость — быстрое внедрение новых функций без согласования с поставщиком 1С
Типичные сценарии применения:
- 📈 Формирование нестандартных отчетов (например, ABC-XYZ анализ номенклатуры)
- 📤 Выгрузка данных в Excel с произвольной структурой
- 🔄 Массовое изменение реквизитов (например, корректировка цен номенклатуры)
- 🤖 Автоматизация рутинных операций (создание документов по расписанию)
⚠️ Внимание: Внешние обработки имеют ограничения по сравнению с встроенными решениями. Они не могут модифицировать структуру базы данных (добавлять новые таблицы или поля) и имеют ограниченный доступ к некоторым системным объектам. Для сложных интеграций может потребоваться разработка расширения конфигурации.
2. Подготовка к разработке: выбор инструментов и среды
Перед тем как приступить к написанию кода, необходимо подготовить рабочее окружение. Вам понадобятся:
- 🖥️ Платформа 1С:Предприятие 8.3 (актуальная версия, лучше последняя стабильная)
- 🛠️ Конфигуратор — входит в комплект поставки 1С
- 📝 Текстовый редактор для работы с кодом (например, Notepad++ или VS Code)
- 🔍 Отладочные инструменты — встроенный отладчик 1С или GDB для сложных случаев
Рекомендуемая последовательность подготовки:
- Установите последнюю версию платформы 1С с официального сайта
- Создайте тестовую базу (лучше на основе типовой конфигурации, с которой будете работать)
- Настройте права доступа — для разработки нужны права администратора
- Подготовьте шаблон обработки (можно скопировать из существующих примеров)
Важный момент: всегда разрабатывайте и тестируйте обработки на тестовой базе, идентичной рабочей. Это позволит избежать проблем с совместимостью. Для сложных проектов имеет смысл использовать систему контроля версий (например, Git) для отслеживания изменений в коде.
| Инструмент | Преимущества | Недостатки |
|---|---|---|
| Встроенный конфигуратор | Не требует дополнительных программ, полная интеграция с платформой | Ограниченные возможности рефакторинга, нет автодополнения |
| 1C:EDT (Eclipse) | Полноценная IDE, поддержка Git, продвинутая отладка | Требует отдельной установки, более сложный для новичков |
| VS Code + расширения | Гибкая настройка, поддержка множества языков, легковесный | Нет полной интеграции с 1С, требует ручной настройки |
⚠️ Внимание: При работе с внешними обработками в 1С:Предприятие 8.3.20+ обратите внимание на изменения в механизме подписей. С этой версии требуется использование сертификатов для подписи обработок, если они содержат потенциально опасный код (работа с файловой системой, реестром и т.д.).
3. Структура внешней обработки: основные элементы
Любая внешняя обработка в 1С состоит из нескольких ключевых компонентов:
1. Реквизиты — переменные, которые хранят данные между вызовами обработки. Могут быть простыми (число, строка) или сложными (таблица значений, справочник). Пример объявления:
Перем мНачалоПериода, мКонецПериода, мСписокНоменклатуры;
2. Формы — интерфейс взаимодействия с пользователем. Можно создавать как простые диалоги, так и сложные многостраничные формы с вкладками. Основные элементы управления:
- 📅 Поле ввода даты (
ПолеВводаДаты) - 🔍 Поле выбора (
ПолеВыбораСправочника) - 📊 Табличное поле (
ТаблицаЗначений) - ✅ Флажок (
ПолеФлажка)
3. Модули — программный код, который выполняет основную логику. Внешняя обработка может содержать:
- 📜 Модуль объекта — общие процедуры и функции
- 📄 Модуль формы — обработчики событий интерфейса
- 🔄 Модуль менеджера — для обработок с несколькими формами
4. Команды — действия, доступные пользователю через интерфейс (кнопки, пункты меню). Пример объявления команды:
Процедура КомандыФормыСформировать(Команда)
// Код формирования отчета
КонецПроцедуры
5. Макеты — шаблоны для печатных форм (в формате 1С, Excel, HTML). Можно создавать как встроенными средствами, так и во внешних редакторах.
Как выглядит структура файла .epf?
Файл внешней обработки (.epf) — это бинарный файл, содержащий сериализованные данные конфигурации. Его можно открыть в конфигураторе или специализированных утилитах (например, EPF Editor). В текстовом виде он не читаем, но при экспорте в XML можно увидеть структуру:
<ВнешняяОбработка>
<Имя>МояОбработка</Имя>
<Реквизиты>...</Реквизиты>
<Формы>...</Формы>
<Модули>...</Модули>
</ВнешняяОбработка>
Для редактирования всегда используйте конфигуратор — ручное изменение файла приведет к его повреждению.
4. Пошаговая инструкция: как создать простую обработку
Рассмотрим процесс создания внешней обработки на примере простого отчета по продажам.
Шаг 1. Создание заготовки
- Откройте конфигуратор в режиме
1С:Предприятие - Выберите
Файл → Новый → Внешняя обработка - Укажите имя обработки (например,
ОтчетПоПродажам) - Сохраните файл с расширением
.epf
Шаг 2. Добавление реквизитов
В окне редактирования обработки перейдите на вкладку Реквизиты и добавьте:
- 📅
ДатаНачала(типДата) - 📅
ДатаОкончания(типДата) - 🏷️
Номенклатура(типСправочникСсылка.Номенклатура) - 📊
Результат(типТаблицаЗначений)
Шаг 3. Создание формы
Перейдите на вкладку Формы и добавьте новую форму. Разместите на ней:
- Два поля ввода для дат
- Поле выбора номенклатуры
- Кнопку
Сформировать - Табличное поле для вывода результата
Шаг 4. Написание кода
В модуле формы добавьте обработчик для кнопки Сформировать:
Процедура Сформировать(Команда)
// Очищаем предыдущие результаты
Результат.Очистить();
// Формируем колонки таблицы
Результат.Колонки.Добавить("Дата");
Результат.Колонки.Добавить("Номенклатура");
Результат.Колонки.Добавить("Количество");
Результат.Колонки.Добавить("Сумма");
// Получаем данные из базы
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РегистрНакопления.Продажи.Период КАК Дата,
| РегистрНакопления.Продажи.Номенклатура КАК Номенклатура,
| СУММА(РегистрНакопления.Продажи.Количество) КАК Количество,
| СУММА(РегистрНакопления.Продажи.Сумма) КАК Сумма
|ИЗ
| РегистрНакопления.Продажи КАК РегистрНакопления.Продажи
|ГДЕ
| РегистрНакопления.Продажи.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
Если Номенклатура.Выбран() Тогда
Запрос.Текст = Запрос.Текст + "
| И РегистрНакопления.Продажи.Номенклатура = &Номенклатура";
КонецЕсли;
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Если Номенклатура.Выбран() Тогда
Запрос.УстановитьПараметр("Номенклатура", Номенклатура.Ссылка);
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Заполняем таблицу результатов
Пока Выборка.Следующий() Цикл
НоваяСтрока = Результат.Добавить();
НоваяСтрока.Дата = Выборка.Дата;
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
НоваяСтрока.Количество = Выборка.Количество;
НоваяСтрока.Сумма = Выборка.Сумма;
КонецЦикла;
КонецПроцедуры
☑️ Проверка перед сохранением обработки
Шаг 5. Тестирование и отладка
Для проверки работы обработки:
- Подключите её к тестовой базе через
Файл → Открыть - Заполните параметры на форме
- Нажмите
Сформироватьи проверьте результат - При ошибках используйте отладчик (
F5для пошагового выполнения)
Для ускорения разработки используйте шаблоны кода (snippets). В конфигураторе можно сохранять часто используемые конструкции (например, стандартные запросы к регистрам) и вставлять их по горячим клавишам.
5. Работа с данными: запросы и объекты 1С
Эффективная работа с данными — ключевой аспект любой внешней обработки. В 1С для этого используются:
1. Запросы на языке 1С
Основной инструмент для выборки данных. Примеры:
- 📌 Простой запрос к справочнику:
ВЫБРАТЬ| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
- 🔗 Запрос с соединением таблиц:
ВЫБРАТЬ| Документ.РеализацияТоваровУслуг.Номер КАК Номер,
| Документ.РеализацияТоваровУслуг.Дата КАК Дата,
| СУММА(Документ.РеализацияТоваровУслуг.СуммаДокумента) КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ.РеализацияТоваровУслуг
|ГДЕ
| Документ.РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
|СГРУППИРОВАТЬ ПО
| Документ.РеализацияТоваровУслуг.Номер,
| Документ.РеализацияТоваровУслуг.Дата
2. Прямое обращение к объектам
Для операций с отдельными документами или справочниками удобнее использовать объекты:
// Создание нового документа
НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
// Запись документа
НовыйДокумент.Записать();
3. Работа с таблицами значений
Для промежуточных расчетов часто используются таблицы значений:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Товар = Справочники.Номенклатура.НайтиПоНаименованию("Стул офисный");
НоваяСтрока.Количество = 5;
НоваяСтрока.Цена = 2500;
4. Использование временных таблиц
Для сложных расчетов удобно использовать временные таблицы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товар КАК Товар,
| СУММА(Количество) КАК ИтогоКоличество
|ПОМЕСТИТЬ втИтоги
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
|СГРУППИРОВАТЬ ПО
| Товар";
Запрос.Выполнить();
// Использование временной таблицы в другом запросе
Запрос2 = Новый Запрос;
Запрос2.Текст =
"ВЫБРАТЬ
| втИтоги.Товар КАК Товар,
| втИтоги.ИтогоКоличество КАК Количество,
| Справочник.Номенклатура.Артикул КАК Артикул
|ИЗ
| втИтоги КАК втИтоги
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Справочник.Номенклатура
| ПО втИтоги.Товар = Справочник.Номенклатура.Ссылка";
⚠️ Внимание: При работе с большими объемами данных (более 100 000 строк) избегайте использования ТаблицаЗначений в памяти. Вместо этого используйте временные таблицы в запросах или постраничную обработку данных. Это предотвратит зависание интерфейса 1С и ошибки нехватки памяти.
6. Оптимизация и отладка обработок
Плохо оптимизированная обработка может значительно замедлить работу 1С. Основные правила оптимизации:
1. Оптимизация запросов
- 🎯 Используйте индексируемые поля в условиях (
ГДЕ) - 🚫 Избегайте
ВЫБРАТЬ РАЗЛИЧНЫЕ— лучше используйтеСГРУППИРОВАТЬ ПО - 📉 Ограничивайте выборку по датам и другим критериям
- 🔄 Для сложных отчетов используйте механизм
Пакетные запросы
2. Работа с объектами
- 🔄 Используйте
Объект.Записать()только когда это необходимо — группируйте изменения - 🗑️ Для массовых операций используйте
Объект.Записать(РежимЗаписиДокумента.Проведение) - 🔍 При поиске по справочникам используйте
НайтиПоРеквизиту()вместо полного перебора
3. Отладка кода
Основные инструменты отладки в 1С:
- 🐞 Пошаговое выполнение (
F5) — для анализа логики - 📋 Точки останова (
F9) — для проверки конкретных участков - 🔍 Просмотр значений — для анализа переменных
- 📊 Журнал регистрации — для отслеживания ошибок
Пример использования отладки:
Процедура ПримерСОтладкой()
Перем а, б, в;
а = 10;
б = 20;
// Установите здесь точку останова (F9) и посмотрите значения переменных
в = а + б;
// Проверка условия с выводом в журнал регистрации
Если в > 15 Тогда
ЗаписатьЖурналРегистрации(НСтр("ру = 'Результат больше 15: "; + в));
КонецЕсли;
КонецПроцедуры
4. Логирование ошибок
Для отслеживания ошибок в рабочих базах используйте:
Процедура ВыполнитьОперацию()
Попытка
// Основной код
Результат = ВыполнитьЗапрос();
Исключение
ЗаписатьЖурналРегистрации(
НСтр("ру = 'Ошибка в обработке ОтчетПоПродажам: "; + ОписаниеОшибки()),
УровеньЖурналаРегистрации.Ошибка
);
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецПроцедуры
Самая частая причина медленной работы обработок — неоптимизированные запросы к базе данных. Всегда проверяйте план выполнения запроса (кнопка "Показать план" в конфигураторе) и убедитесь, что используются индексы.
7. Безопасность и совместимость
При разработке внешних обработок необходимо учитывать вопросы безопасности и совместимости с разными версиями платформы.
1. Безопасность кода
- 🔒 Проверка прав доступа — всегда проверяйте права пользователя перед выполнением критичных операций:
Если НЕ Пользователь.Профиль.Содержит("Администратор") ТогдаСообщить("У вас недостаточно прав для выполнения этой операции!");
Возврат;
КонецЕсли;
- 🛡️ Защита от SQL-инъекций — используйте параметры в запросах вместо конкатенации строк
- 🔐 Шифрование чувствительных данных — для хранения паролей используйте
ХранилищеЗначенийилиЗащищенноеХранилище
2. Совместимость с версиями
Для обеспечения совместимости:
- 📋 Используйте
#Если ВерсияПлатформы >= "8.3.15" Тогдадля кода, зависящего от версии - 🔄 Тестируйте обработку на разных версиях платформы (минимально поддерживаемая — 8.3.10)
- 📊 Избегайте использования новых свойств объектов, если обработка должна работать на старых версиях
3. Подпись обработок
С версии 8.3.20 внешние обработки, содержащие потенциально опасный код, должны быть подписаны:
- Сгенерируйте сертификат в
1С:ПредприятиечерезАдминистрирование → Сертификаты - Подпишите обработку в конфигураторе через
Файл → Подписать - При подключении обработки в пользовательском режиме будет проверяться подпись
4. Лицензионные ограничения
Учитывайте ограничения лицензий 1С:
- 📄 Базовая версия — ограничения на количество пользователей и объем данных
- 🏢 ПРОФ — полная функциональность, но требует сервера 1С
- ☁️ Облачная версия — ограничения на работу с файловой системой
⚠️ Внимание: При разработке обработок для 1С:Fresh (облачной версии) учитывайте, что прямой доступ к файловой системе и некоторым системным функциям заблокирован. Используйте только разрешенные методы работы с файлами черезПолучениеФайлаиЗаписьФайла.
8. Внедрение и сопровождение обработок
Создание обработки — только часть работы. Не менее важно правильно внедрить её в рабочую базу и обеспечить дальнейшее сопровождение.
1. Тестирование перед внедрением
Минимальный чек-лист перед внедрением:
☑️ Чек-лист перед внедрением
2. Способы подключения обработки
Внешнюю обработку можно подключить несколькими способами:
- 📂 Через файл —
Файл → Открытьв пользовательском режиме - 📋 Через справочник — добавить в
Справочник.ВнешниеОбработки - 🔄 Автоматически — через код при старте системы:
Процедура ПриНачалеРаботыСистемы()ПутьКФайлу = "C:\Обработки\МояОбработка.epf";
Если ФайлСуществует(ПутьКФайлу) Тогда
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу);
Обработка.ОткрытьФорму();
КонецЕсли;
КонецПроцедуры
3. Обновление обработок
Для обновления внешних обработок:
- 📥 Создайте механизм проверки версии обработки
- 🔄 Реализуйте автоматическое обновление через <