Доработка 1С без боли: расширение, обработка или правка конфигурации
Содержание
Дописать программу 1С 8.3 в большинстве задач лучше всего через расширение конфигурации
(файл .cfe): типовая конфигурация остаётся на поддержке и обновляется без ручного объединения. Для новой печатной формы или разовой операции хватит внешней обработки (.epf), а правка самой конфигурации нужна только там, где расширение не справляется.
Типичная ситуация: главбух просит «добавить в счёт строку с номером договора» и «чтобы реализации не проводились без склада». Через месяц выходит обновление, и программист, который правил типовой модуль, тратит день на сравнение и объединение. Ниже — порядок работы, при котором доработка программы 1С не превращается в такие проблемы.
1. Разбор задачи до первой строки кода
Заказчик обычно описывает не задачу, а решение: «добавьте реквизит», «сделайте кнопку». Сначала выясните, что он хочет получить на выходе.
Задайте пять вопросов:
- 🎯 Что должно измениться в результате? Печатная форма, отчёт, проверка при проведении, новое поле в документе.
- 👥 Кто будет этим пользоваться? Один бухгалтер или 30 менеджеров — от этого зависят права и производительность.
- 📅 Как часто? Разовая загрузка остатков и ежедневная операция решаются разными инструментами.
- 🔁 Что сейчас делают руками? Часто выясняется, что нужная функция уже есть в типовой, просто не включена в настройках.
- ✅ Как поймём, что готово? Нужен конкретный пример: «для документа № 125 печать показывает договор № Д-17 от 01.03».
Проверьте, нет ли этого в типовой
Перед разработкой откройте Администрирование → Параметры учёта (в БП 3.0 часть настроек — в Главное → Функциональность). Многие «доработки» решаются галочкой: учёт по складам, партиям, дополнительные реквизиты.
Дополнительные реквизиты и сведения добавляют поле в справочник или документ без программирования. Путь в БП 3.0 и УТ 11: Администрирование → Общие настройки → Дополнительные реквизиты и сведения. Если задача — просто хранить значение и отбирать по нему список, кодить не нужно.
Зафиксируйте ТЗ письменно
Даже короткое письмо с перечнем «что меняем, где, как проверяем» снимает большую часть споров при сдаче. В ТЗ укажите конфигурацию, её релиз и версию платформы: доработка под релиз 3.0.150 может вести себя иначе на 3.0.170.
2. Расширение, внешняя обработка или правка конфигурации
Выбор способа определяет, сколько будет стоить каждое следующее обновление. Сравните три пути.
| Способ | Когда подходит | Что с обновлениями | Риски |
|---|---|---|---|
Внешняя обработка / отчёт (.epf, .erf) | Печатные формы, отчёты, заполнение табличных частей, разовые обработки | Не затрагивает конфигурацию | Нельзя добавить реквизит в документ или изменить проведение |
Расширение конфигурации (.cfe) | Новые реквизиты, изменение форм, вмешательство в процедуры модулей, свои объекты | Типовая остаётся на поддержке, расширение проверяют после обновления | Перехват может перестать работать, если 1С переименовала процедуру |
| Изменение основной конфигурации | Расширение принципиально не справляется (редкие случаи с изменением структуры типовых объектов) | Каждое обновление — сравнение и объединение | Ошибки при объединении, потеря доработок |
Правку основной конфигурации выбирайте последней, а не первой. Расширения есть с платформы 8.3.6, а с 8.3.16 добавлена аннотация &ИзменениеИКонтроль, которая закрыла большинство причин снимать типовую с поддержки.
Внешняя обработка: подключение через БСП
В типовых конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) внешние обработки регистрируют через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Чтобы обработка встала в список печатных форм документа, в её модуле объекта должна быть экспортная функция СведенияОВнешнейОбработке().
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Счёт с договором";
Команда.Идентификатор = "СчетСДоговором";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Имена документов в Назначение пишите точно так, как они названы в метаданных вашей конфигурации.
Расширение: перехват процедур
В конфигураторе откройте Конфигурация → Расширения конфигурации, добавьте новое расширение и задайте префикс, например ик_. Типовой объект заимствуют из контекстного меню («Добавить в расширение»), после чего в модуле расширения можно вмешаться в процедуру типового модуля.
Четыре аннотации:
&Перед("Имя")— ваш код выполнится до типовой процедуры.&После("Имя")— после неё.&Вместо("Имя")— вместо; типовую при необходимости вызывают черезПродолжитьВызов().&ИзменениеИКонтроль("Имя")— копия типовой процедуры с вашими вставками; при изменении исходной процедуры в обновлении платформа сообщит о расхождении.
Пример проверки склада перед проведением:
&Перед("ОбработкаПроверкиЗаполнения")
Процедура ик_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Не ЗначениеЗаполнено(Склад) Тогда
ОбщегоНазначения.СообщитьПользователю("Не указан склад", ЭтотОбъект, "Склад", , Отказ);
КонецЕсли;
КонецПроцедуры
В свойствах расширения задайте «Назначение» по смыслу: «Исправление» для исправления ошибок типовой, «Адаптация» для доработок под заказчика. Исправления применяются раньше адаптаций. Флаг «Безопасный режим» снимайте только если коду действительно нужны файлы, COM или внешние компоненты.
Если без правки конфигурации не обойтись
В конфигураторе: Конфигурация → Поддержка → Настройка поддержки, кнопка «Включить возможность изменения». Для каждого изменяемого объекта выбирайте режим «Объект поставщика редактируется с сохранением поддержки», а не «снят с поддержки». Тогда при обновлении вы увидите изменения поставщика и сможете объединить их со своими.
3. Как писать код доработки, чтобы его можно было сопровождать
Хорошая доработка 1С читается тем, кто её не писал. Несколько правил, которые экономят время на втором и третьем году жизни кода.
Правила оформления
- Префикс у всех своих объектов, реквизитов и процедур (
ик_). Через год по префиксу сразу видно, что своё, а что типовое. - Маркеры изменений в типовом коде, если правите конфигурацию напрямую:
// ик_Начало Задача 125 Проверка склада ... // ик_Конец - Директивы компиляции у каждой процедуры формы:
&НаКлиенте,&НаСервере,&НаСервереБезКонтекста. Тяжёлые вычисления — на сервере, с минимумом серверных вызовов. - Свои модули под логику, а в типовом коде — одна строка вызова. Чем меньше строк внутри типовой процедуры, тем проще объединение.
Типовые промахи в коде
- 🐢 Запрос в цикле. 500 строк табличной части — 500 обращений к базе. Соберите данные одним запросом с
ВЫБРАТЬ … ГДЕ Ссылка В (&Список). - 🔗 Обращение через точку вроде
Документ.Контрагент.ОсновнойДоговор.Валютана клиенте. Каждая точка — серверный вызов. - 🔒 Запись без транзакции, когда несколько объектов должны измениться вместе. Используйте
НачатьТранзакцию()/ЗафиксироватьТранзакцию()сОтменитьТранзакцию()в блокеИсключение. - 🧮 Склейка числа со строкой без форматирования:
"Строка " + 1250даст «1 250» с неразрывным пробелом. ПишитеФормат(Число, "ЧГ=0"). - 🔐 Привилегированный режим «на всякий случай». Он обходит права, и ошибка в коде сделает больше вреда.
После каждого блока изменений запускайте Конфигурация → Проверка конфигурации (или проверку в свойствах расширения). Синтаксический контроль ловит ошибки в серверных модулях, которые при обычном запуске проявятся только в момент вызова.
4. Тестирование доработки до сдачи заказчику
Тестировать в рабочей базе нельзя ни при каких сроках. Порядок такой.
Подготовьте копию базы
Выгрузите рабочую базу в .dt через конфигуратор (Администрирование → Выгрузить информационную базу) и загрузите в новую пустую базу. Для выгрузки нужен монопольный режим — делайте это вне рабочего времени или предупредите пользователей, что их сеансы придётся завершить.
В копии базы отключите регламентные задания обмена и отправки почты, иначе тестовые документы уйдут контрагентам или в узлы обмена.
Что проверять
- ✅ Основной сценарий на примере из ТЗ: те самые документ № 125 и договор № Д-17.
- ✅ Пустые значения: документ без договора, без склада, с нулевой суммой.
- ✅ Права: зайдите пользователем с ролью бухгалтера, а не администратором. Частая причина «у меня работает» — полные права разработчика.
- ✅ Объём: проведите документ на 300-500 строк и засеките время.
- ✅ Перепроведение закрытого периода, если доработка влияет на движения.
- ✅ Тонкий и веб-клиент, если ими пользуются: серверный вызов, который в толстом клиенте прошёл, в тонком может упасть.
Отладка
Поставьте точку останова (F9) в модуле и запустите Отладка → Начать отладку. Для клиент-серверной базы отладку нужно разрешить на сервере — при запуске службы сервера 1С с ключом -debug. Изменение параметров службы требует её перезапуска, поэтому на рабочем сервере это планируют заранее: перезапуск оборвёт сеансы всех пользователей.
5. Внедрение: как передать доработку без сюрпризов
Порядок установки в рабочую базу:
- Сделайте свежую резервную копию рабочей базы.
- Расширение загрузите через
Конфигурация → Расширения конфигурации → Конфигурация → Загрузить конфигурацию из файла, затем отдельно выполнитеОбновить конфигурацию базы данных. Без второго шага расширение не применится. В пользовательском режиме БСП-конфигураций то же делают вАдминистрирование → Печатные формы, отчеты и обработки → Расширения. - Внешнюю обработку добавьте в справочник дополнительных обработок и настройте размещение и доступ пользователям.
- Попросите пользователя перезапустить 1С — изменения расширения подхватываются при новом сеансе.
- Вместе с заказчиком пройдите пример из ТЗ и получите подтверждение письмом.
Что передать вместе с доработкой
- 📄 Короткую инструкцию для пользователя: где кнопка, что заполнять.
- 🧾 Описание для программиста: список изменённых объектов, перехваченных процедур, номер релиза, на котором проверено.
- 💾 Исходники: файл
.cfeили.epfс номером версии в имени, напримерik_sklad_1.2.cfe.
6. Сопровождение и развитие доработок после обновлений
Главная стоимость доработки — не написание, а жизнь после каждого обновления типовой.
После обновления конфигурации
- Откройте расширение в конфигураторе и запустите проверку: платформа покажет, какие перехваченные процедуры исчезли или изменились.
- Если используется
&ИзменениеИКонтроль, сравните новую версию типовой процедуры со своей копией и перенесите вставки. - При правке основной конфигурации обновление идёт через сравнение и объединение: внимательно смотрите на объекты, изменённые и вами, и поставщиком.
Как не утонуть в доработках
- 📚 Ведите реестр: доработка, дата, заказчик, объекты, файл. Через два года без реестра никто не вспомнит, откуда в форме лишняя кнопка.
- 🗂 Работаете вдвоём и больше — подключите хранилище конфигурации (
Конфигурация → Хранилище конфигурации): видно, кто и когда захватил объект, есть история версий. - 🧹 Раз в год пересматривайте реестр: часть доработок типовая уже умеет сама, их можно отключить.
- 📦 Не держите десяток мелких расширений: объединяйте их по смыслу в два-три, иначе порядок применения начнёт влиять на результат.
7. Ошибки, из-за которых доработка дорожает
Ошибки, которые не видны в момент сдачи и вылезают позже:
- ❌ Снятие типовой с поддержки целиком ради одной процедуры. После этого автоматическое обновление недоступно, каждое — ручное объединение.
- ❌ Доработка без привязки к релизу. Расширение проверено на старом релизе, заказчик обновился, перехват упал с ошибкой при проведении.
- ❌ Хранение исходников только в базе заказчика. Базу пересоздали из
.dtчужой копии — доработка пропала. - ❌ Расширение с назначением «Адаптация» для исправления ошибки типовой. Порядок применения окажется не тем, что вы ждали.
- ❌ Оплата «по факту» без ТЗ. Объём растёт, сроки срываются, обе стороны недовольны.