Современные конфигурации 1С, такие как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация 2 и даже 1С:Бухгалтерия предприятия 3.0, кардинально отличаются от своих предшественников (7.7, УПП, БП 2.0). Если раньше программист мог относительно легко «влезть» в код закрытия месяца и подправить алгоритм распределения затрат, то сегодня это требует не только навыков кодинга, но и глубокого понимания высшей математики и архитектуры СУБД. Разберем подробно, почему это произошло и как правильно подходить к задаче изменения расчетов в современных реалиях.
Проанализируем, почему старые методы «чтения кода» больше не работают. В системах прошлых поколений (например, в УПП 1.3 с партионным учетом) расчет шел последовательно: документ за документом, запись за записью. В современных же решениях используется метод решения СЛАУ (Системы линейных алгебраических уравнений).
Рассмотрим ситуацию встречного выпуска: цех №1 передал деталь цеху №2, а цех №2 оказал услугу цеху №1. В старых системах это вызывало бесконечные итерации или ошибки. Современная 1С:ERP строит гигантскую матрицу коэффициентов и решает ее целиком. Код, отвечающий за это, крайне абстрактен. Вы не найдете там простой формулы Себестоимость = ПрямыеЗатраты + КосвенныеЗатраты. Вместо этого вы увидите формирование сложнейших временных таблиц, которые передаются в математическое ядро (решатель).
Разберем техническую сторону вопроса. В современных конфигурациях основная вычислительная нагрузка перенесена на сервер баз данных. Расчет себестоимости — это не цикл Для Каждого Строка Из ТаблицаЗатрат, а последовательность из сотен тяжелых SQL-запросов, генерирующих временные таблицы объемом в миллионы строк. Посмотрим на основные сложности такого подхода:
РегистрНакопления.СебестоимостьТоваров или РегистрСведений.ДанныеПервичныхДокументов связаны между собой неявными связями, которые учитывает алгоритм закрытия месяца.Как отмечают опытные специалисты, наиболее безопасным методом модификации логики является предварительная подготовка данных. Вместо того чтобы менять алгоритм в модуле ПроведениеРасчетаСебестоимости, рассмотрим вариант использования обработок заполнения табличных частей.
Например, если вам нужно специфическое распределение затрат на 20-й счет, создайте внешнюю обработку или расширение, которое по определенной логике заполняет документ «Распределение прочих затрат» или «Отражение зарплаты в финансовом учете». Таким образом, вы подаете системе «правильные» первичные данные, которые типовой (и очень сложный) механизм «съест» без ошибок. Это сохранит базу обновляемой и предсказуемой.
Выясним, как поступить, если типовые регистры категорически не подходят для ваших управленческих нужд. В современных конфигурациях считается «хорошим тоном» не портить типовые регистры, а создавать свои. Рассмотрим алгоритм действий:
ПриЗаписи или ОбработкаПроведения) фиксируем в них нужные данные.Пример реализации подписки в расширении:
&После("ОбработкаПроведения")
Процедура Расш1_ПриобретениеТоваровУслугОбработкаПроведения(Источник, Отказ, РежимПроведения)
// Наша логика записи в дополнительные регистры
НаборЗаписей = РегистрыНакопления.Расш1_ДопЗатраты.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Источник.Ссылка);
// ... заполнение и запись
НаборЗаписей.Записать();
КонецПроцедуры
Для тех, кто все же вынужден разбираться в типовых расчетах, проанализируем доступный инструментарий. В 1С:ERP и КА реализованы механизмы, позволяющие понять логику системы без «ковыряния» в СЛАУ:
Нужно четко понимать, что «героизм» в переписывании ядра расчетов обходится бизнесу очень дорого. Рассмотрим основные риски:
Подведем итог. Входить в код современных расчетов 1С стоит только в исключительных случаях, когда все остальные методы (настройка учетной политики, использование расширений для заполнения документов, корректировка данных до расчета) исчерпаны. Современный подход программиста 1С заключается в умении выстроить методологию так, чтобы типовые механизмы работали корректно на правильно подготовленных данных. Помните: чем меньше вы трогаете ядро системы, тем надежнее и дешевле будет ее эксплуатация в долгосрочной перспективе.