В данной статье приводится пример на конфигурации "1С: Комплексная автоматизация 1.1" по созданию универсального механизма распределения затрат по 20ым счетам.
Не вдаваясь в подробности "что, как и почему?", начну с описания своих действий. Сразу замечу, что нам также необходимо добавить свои объекты в конфигруцию, но наши изменения никак не будут влиять на сложность последующего обновления конфигурации.
Первое действие: Открываем конфигуратор 😃
В конфигураторе добавляем общий модуль с специфичным названием "Алгоритм_ОбработкаПроведения". Обязательно выставляем: "Сервер" и "Привилегированный". "Сервер" - необходимо чтобы вызов нашего модуля происходил в последнюю очередь.
В модуле прописываем следующий код:
/////----------------- Расчет себестоимости +++
Процедура Алгоритм_ОбработкаПроведения_РасчетСебестоимостиВыпускаОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
ВыбратьИВыполнитьАлгоритмыОчистки(Источник);
ВыбратьИВыполнитьАлгоритмыРасчета(Источник);
КонецПроцедуры
Процедура ВыбратьИВыполнитьАлгоритмыОчистки(Источник)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних.ХарактерЗатрат,
| Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних.АлгоритмБУ,
| Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних.АлгоритмНУ,
| Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних.АлгоритмБУРАУЗ
|ИЗ
| РегистрСведений.Алгоритм_СпособыЗакрытияСебестоимости.СрезПоследних(&Период, ОчисткаДанных) КАК Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних";
Запрос.УстановитьПараметр("Период", КонецМесяца(Источник.Дата));
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
////+++ Очищаем регистр бухгалтерии
АлгоритмОчистки_СКД = ВыборкаДетальныеЗаписи.АлгоритмБУ.Получить();
Для каждого АлгоритмОчистки_НаборДанных из АлгоритмОчистки_СКД.НаборыДанных Цикл
АлгоритмОчистки_Запрос = Новый Запрос(АлгоритмОчистки_НаборДанных.Запрос);
Для каждого АлгоритмОчистки_Праметры из АлгоритмОчистки_СКД.Параметры Цикл
АлгоритмОчистки_Запрос.УстановитьПараметр(АлгоритмОчистки_Праметры.Имя, АлгоритмОчистки_Праметры.Значение);
КонецЦикла;
АлгоритмОчистки_Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Источник.Дата));
АлгоритмОчистки_Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Источник.Дата));
АлгоритмОчистки_Запрос.УстановитьПараметр("НачалоПериодаГраница", Новый Граница(НачалоМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмОчистки_Запрос.УстановитьПараметр("КонецПериодаГраница", Новый Граница(КонецМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмОчистки_Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
АлгоритмОчистки_Хозрасчетный = Источник.Движения.Хозрасчетный;
АлгоритмОчистки_Хозрасчетный.Прочитать();
АлгоритмОчистки_Выборка = АлгоритмОчистки_Запрос.Выполнить().Выбрать();
Пока АлгоритмОчистки_Выборка.Следующий() Цикл
НомерСтроки = АлгоритмОчистки_Выборка.НомерСтроки - 1;
АлгоритмОчистки_Хозрасчетный.Удалить(НомерСтроки);
КонецЦикла;
Попытка АлгоритмОчистки_Хозрасчетный.Записать(); Исключение
Сообщить("Ошибки в алгоритме очистки регистра",СтатусСообщения.ОченьВажное);
КонецПопытки;
КонецЦикла;
////--- Очищаем регистр бухгалтерии
////+++ Очищаем регистр налоговый
АлгоритмОчистки_СКД = ВыборкаДетальныеЗаписи.АлгоритмНУ.Получить();
Для каждого АлгоритмОчистки_НаборДанных из АлгоритмОчистки_СКД.НаборыДанных Цикл
АлгоритмОчистки_Запрос = Новый Запрос(АлгоритмОчистки_НаборДанных.Запрос);
Для каждого АлгоритмОчистки_Праметры из АлгоритмОчистки_СКД.Параметры Цикл
АлгоритмОчистки_Запрос.УстановитьПараметр(АлгоритмОчистки_Праметры.Имя, АлгоритмОчистки_Праметры.Значение);
КонецЦикла;
АлгоритмОчистки_Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Источник.Дата));
АлгоритмОчистки_Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Источник.Дата));
АлгоритмОчистки_Запрос.УстановитьПараметр("НачалоПериодаГраница", Новый Граница(НачалоМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмОчистки_Запрос.УстановитьПараметр("КонецПериодаГраница", Новый Граница(КонецМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмОчистки_Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
АлгоритмОчистки_Налоговый = Источник.Движения.Налоговый;
АлгоритмОчистки_Налоговый.Прочитать();
АлгоритмОчистки_Выборка = АлгоритмОчистки_Запрос.Выполнить().Выбрать();
Пока АлгоритмОчистки_Выборка.Следующий() Цикл
НомерСтроки = АлгоритмОчистки_Выборка.НомерСтроки - 1;
АлгоритмОчистки_Налоговый.Удалить(НомерСтроки);
КонецЦикла;
АлгоритмОчистки_Налоговый.Записать();
КонецЦикла;
////--- Очищаем регистр налоговый
////+++ Очищаем регистр РАУЗРегл
АлгоритмОчистки_СКД = ВыборкаДетальныеЗаписи.АлгоритмБУРАУЗ.Получить();
Для каждого АлгоритмОчистки_НаборДанных из АлгоритмОчистки_СКД.НаборыДанных Цикл
АлгоритмОчистки_Запрос = Новый Запрос(АлгоритмОчистки_НаборДанных.Запрос);
Для каждого АлгоритмОчистки_Праметры из АлгоритмОчистки_СКД.Параметры Цикл
АлгоритмОчистки_Запрос.УстановитьПараметр(АлгоритмОчистки_Праметры.Имя, АлгоритмОчистки_Праметры.Значение);
КонецЦикла;
АлгоритмОчистки_Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Источник.Дата));
АлгоритмОчистки_Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Источник.Дата));
АлгоритмОчистки_Запрос.УстановитьПараметр("НачалоПериодаГраница", Новый Граница(НачалоМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмОчистки_Запрос.УстановитьПараметр("КонецПериодаГраница", Новый Граница(КонецМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмОчистки_Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
АлгоритмОчистки_УчетЗатратРегл = Источник.Движения.УчетЗатратРегл;
АлгоритмОчистки_УчетЗатратРегл.Прочитать();
АлгоритмОчистки_Выборка = АлгоритмОчистки_Запрос.Выполнить().Выбрать();
Пока АлгоритмОчистки_Выборка.Следующий() Цикл
НомерСтроки = АлгоритмОчистки_Выборка.НомерСтроки - 1;
АлгоритмОчистки_УчетЗатратРегл.Удалить(НомерСтроки);
КонецЦикла;
АлгоритмОчистки_УчетЗатратРегл.Записать();
КонецЦикла;
////--- Очищаем регистр РАУЗРегл
КонецЦикла;
КонецПроцедуры
Процедура ВыбратьИВыполнитьАлгоритмыРасчета(Источник)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних.ХарактерЗатрат,
| Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних.АлгоритмБУ,
| Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних.АлгоритмНУ,
| Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних.АлгоритмБУРАУЗ
|ИЗ
| РегистрСведений.Алгоритм_СпособыЗакрытияСебестоимости.СрезПоследних(&Период, (НЕ ОчисткаДанных)) КАК Алгоритм_СпособыЗакрытияСебестоимостиСрезПоследних";
Запрос.УстановитьПараметр("Период", КонецМесяца(Источник.Дата));
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
////+++ Пишем регистр бухгалтерии
АлгоритмЗаполнения_СКД = ВыборкаДетальныеЗаписи.АлгоритмБУ.Получить();
Для каждого АлгоритмЗаполнения_НаборДанных из АлгоритмЗаполнения_СКД.НаборыДанных Цикл
АлгоритмЗаполнения_Запрос = Новый Запрос(АлгоритмЗаполнения_НаборДанных.Запрос);
Для каждого АлгоритмЗаполнения_Праметры из АлгоритмЗаполнения_СКД.Параметры Цикл
АлгоритмЗаполнения_Запрос.УстановитьПараметр(АлгоритмЗаполнения_Праметры.Имя, АлгоритмЗаполнения_Праметры.Значение);
КонецЦикла;
АлгоритмЗаполнения_Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Источник.Дата));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Источник.Дата));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("НачалоПериодаГраница", Новый Граница(НачалоМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("КонецПериодаГраница", Новый Граница(КонецМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
АлгоритмЗаполнения_Хозрасчетный = Источник.Движения.Хозрасчетный;
АлгоритмЗаполнения_Хозрасчетный.Прочитать();
АлгоритмЗаполнения_Выборка = АлгоритмЗаполнения_Запрос.Выполнить().Выбрать();
Пока АлгоритмЗаполнения_Выборка.Следующий() Цикл
АлгоритмЗаполнения_Запись = АлгоритмЗаполнения_Хозрасчетный.Добавить();
ЗаполнитьЗначенияСвойств(АлгоритмЗаполнения_Запись, АлгоритмЗаполнения_Выборка);
Для и1 = 1 по 3 Цикл
Попытка
Знач_Субк = АлгоритмЗаполнения_Выборка["СубконтоДт"+и1];
СчетДт = АлгоритмЗаполнения_Выборка["СчетДт"];
ВидСубконто = ОпределитьВидСубконто(СчетДт, Знач_Субк);
Если не ВидСубконто = неопределено Тогда
АлгоритмЗаполнения_Запись.СубконтоДт.Вставить(ВидСубконто, Знач_Субк);
КонецЕсли;
Исключение КонецПопытки;
Попытка
Знач_Субк = АлгоритмЗаполнения_Выборка["СубконтоКт"+и1];
СчетКт = АлгоритмЗаполнения_Выборка["СчетКт"];
ВидСубконто = ОпределитьВидСубконто(СчетКт, Знач_Субк);
Если не ВидСубконто = неопределено Тогда
АлгоритмЗаполнения_Запись.СубконтоКт.Вставить(ВидСубконто, Знач_Субк);
КонецЕсли;
Исключение КонецПопытки;
КонецЦикла;
КонецЦикла;
АлгоритмЗаполнения_Хозрасчетный.Записать();
КонецЦикла;
////--- Пишем регистр бухгалтерии
////+++ Пишем регистр налоговый
АлгоритмЗаполнения_СКД = ВыборкаДетальныеЗаписи.АлгоритмНУ.Получить();
Для каждого АлгоритмЗаполнения_НаборДанных из АлгоритмЗаполнения_СКД.НаборыДанных Цикл
АлгоритмЗаполнения_Запрос = Новый Запрос(АлгоритмЗаполнения_НаборДанных.Запрос);
Для каждого АлгоритмЗаполнения_Праметры из АлгоритмЗаполнения_СКД.Параметры Цикл
АлгоритмЗаполнения_Запрос.УстановитьПараметр(АлгоритмЗаполнения_Праметры.Имя, АлгоритмЗаполнения_Праметры.Значение);
КонецЦикла;
АлгоритмЗаполнения_Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Источник.Дата));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Источник.Дата));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("НачалоПериодаГраница", Новый Граница(НачалоМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("КонецПериодаГраница", Новый Граница(КонецМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
АлгоритмЗаполнения_Налоговый = Источник.Движения.Налоговый;
АлгоритмЗаполнения_Налоговый.Прочитать();
АлгоритмЗаполнения_Выборка = АлгоритмЗаполнения_Запрос.Выполнить().Выбрать();
Пока АлгоритмЗаполнения_Выборка.Следующий() Цикл
АлгоритмЗаполнения_Запись = АлгоритмЗаполнения_Налоговый.Добавить();
ЗаполнитьЗначенияСвойств(АлгоритмЗаполнения_Запись, АлгоритмЗаполнения_Выборка);
Для и1 = 1 по 3 Цикл
Попытка
Знач_Субк = АлгоритмЗаполнения_Выборка["СубконтоДт"+и1];
СчетДт = АлгоритмЗаполнения_Выборка["СчетДт"];
ВидСубконто = ОпределитьВидСубконто(СчетДт, Знач_Субк);
Если не ВидСубконто = неопределено Тогда
АлгоритмЗаполнения_Запись.СубконтоДт.Вставить(ВидСубконто, Знач_Субк);
КонецЕсли;
Исключение КонецПопытки;
Попытка
Знач_Субк = АлгоритмЗаполнения_Выборка["СубконтоКт"+и1];
СчетКт = АлгоритмЗаполнения_Выборка["СчетКт"];
ВидСубконто = ОпределитьВидСубконто(СчетКт, Знач_Субк);
Если не ВидСубконто = неопределено Тогда
АлгоритмЗаполнения_Запись.СубконтоКт.Вставить(ВидСубконто, Знач_Субк);
КонецЕсли;
Исключение КонецПопытки;
КонецЦикла;
КонецЦикла;
АлгоритмЗаполнения_Налоговый.Записать();
КонецЦикла;
////--- Пишем регистр налоговый
////+++ Пишем регистр РАУЗРегл
АлгоритмЗаполнения_СКД = ВыборкаДетальныеЗаписи.АлгоритмБУРАУЗ.Получить();
Для каждого АлгоритмЗаполнения_НаборДанных из АлгоритмЗаполнения_СКД.НаборыДанных Цикл
АлгоритмЗаполнения_Запрос = Новый Запрос(АлгоритмЗаполнения_НаборДанных.Запрос);
Для каждого АлгоритмЗаполнения_Праметры из АлгоритмЗаполнения_СКД.Параметры Цикл
АлгоритмЗаполнения_Запрос.УстановитьПараметр(АлгоритмЗаполнения_Праметры.Имя, АлгоритмЗаполнения_Праметры.Значение);
КонецЦикла;
АлгоритмЗаполнения_Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Источник.Дата));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Источник.Дата));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("НачалоПериодаГраница", Новый Граница(НачалоМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("КонецПериодаГраница", Новый Граница(КонецМесяца(Источник.Дата), ВидГраницы.Включая));
АлгоритмЗаполнения_Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
АлгоритмЗаполнения_УчетЗатратРегл = Источник.Движения.УчетЗатратРегл;
АлгоритмЗаполнения_УчетЗатратРегл.Прочитать();
АлгоритмЗаполнения_Выборка = АлгоритмЗаполнения_Запрос.Выполнить().Выбрать();
Пока АлгоритмЗаполнения_Выборка.Следующий() Цикл
АлгоритмЗаполнения_Запись = АлгоритмЗаполнения_УчетЗатратРегл.Добавить();
ЗаполнитьЗначенияСвойств(АлгоритмЗаполнения_Запись, АлгоритмЗаполнения_Выборка);
КонецЦикла;
АлгоритмЗаполнения_УчетЗатратРегл.Записать();
КонецЦикла;
////--- Пишем регистр РАУЗРегл
КонецЦикла;
КонецПроцедуры
Функция ОпределитьВидСубконто(Счет, Знач_Субк) Экспорт
Результат = Неопределено;
ТипЗнчСК = ТипЗнч(Знач_Субк);
Для каждого ВС из Счет.ВидыСубконто Цикл
Если ВС.ВидСубконто.ТипЗначения.СодержитТип(ТипЗнчСК) Тогда
Результат = ВС.ВидСубконто;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
/////----------------- Расчет себестоимости ---
Подробные разъяснения по представленному коду давать особого смысла не вижу смысла. т.к. по окончании статьи станет ясен каждый выполненный шаг. А что происходит в приведенном модуле примерно ясно по коду, даже на первый взгляд.
А вкратце так:
- Сначала ищем актуальный на текущий месяц алгоритм очистки регистров
- Выполняем непосредственное удаление записей по фильтру
- Ищем актуальный на текущий месяц алгоритм распределения
- Последовательно перебираем все запросы в СКД по определенному разделу учета. Производим заполнение параметров и выполняем. Ничего сверхестественного. Условности есть только в специфичных бухгалтерских регистрах, что видно по коду
Второе действие:
Добавляем подписку на событие. Источник - документ производящий стандартное распределение 20ых счетов (мой случай: "РасчетСебестоимостиВыпуска"). Событие - ОбработкаПроведения. Обработчик - указываем нашу процедуру в созданном общем модуле (Алгоритм_ОбработкаПроведения_РасчетСебестоимостиВыпускаОбработкаПроведения - точка входа).
На текущем этапе у нас есть модуль, который срабатывает при распределении затрат. Но так и нет механизма, который бы отработал и распределил затраты так как надо нам.
Третие действие:
Добавляем регистр сведений "Алгоритм_СпособыЗакрытияСебестоимости". Устанавливаем периодичность "Месяц", режим записи "независимый". Добавляем ресурсы "АлгоритмБУ, АлгоритмНУ, АлгоритмБУРАУЗ" тип "ХранилищеЗначения". Измерения хоть у меня и добавлены, практическое применение они не имеют. В реквизиты добавляем "Описание" - строка, "ОчисткаДанных"- булево. Собственно информация из этого регистра и будет использоваться для выполнения распределения.
Но чтоб нам было понятно что там будет храниться и как с этим работать выполним следующий шаг.
Четвертый шаг:
Добавляем форму записи для регистра сведений, примерно следующего вида (но, в принципе, у каждого человека своя фантазия 😉 ):
В форме редактирование ресурсов организуем через элемент надпись с свойством гиперссылка. По нажатии на надпись выдается стандартное окно СКД, в котором и будем в последующим указывать что и как делать.
Модуль формы:
Перем ВыбраннаяСКД;
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
Если Тип(ЗначениеВыбора) = Тип("СхемаКомпоновкиДанных") Тогда
Если ВыбраннаяСКД = "АлгоритмБУ" Тогда
АлгоритмБУ = Новый ХранилищеЗначения(ЗначениеВыбора);
ИначеЕсли ВыбраннаяСКД = "АлгоритмБУРАУЗ" Тогда
АлгоритмБУРАУЗ = Новый ХранилищеЗначения(ЗначениеВыбора);
ИначеЕсли ВыбраннаяСКД = "АлгоритмНУ" Тогда
АлгоритмНУ = Новый ХранилищеЗначения(ЗначениеВыбора);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура НадписьАлгоритмРаспределенияБУНажатие(Элемент)
СКД = АлгоритмБУ.Получить();
Если СКД = Неопределено Тогда
СКД = Новый СхемаКомпоновкиДанных;
КонецЕсли;
ВыбраннаяСКД = "АлгоритмБУ";
// Вызовем конструктор для интерактивного изменения СКД
КонструкторСКД = Новый КонструкторСхемыКомпоновкиДанных(СКД);
КонструкторСКД.Редактировать(ЭтаФорма);
КонецПроцедуры
Процедура НадписьАлгоритмРаспределенияБУРАУЗНажатие(Элемент)
СКД = АлгоритмБУРАУЗ.Получить();
Если СКД = Неопределено Тогда
СКД = Новый СхемаКомпоновкиДанных;
КонецЕсли;
ВыбраннаяСКД = "АлгоритмБУРАУЗ";
// Вызовем конструктор для интерактивного изменения СКД
КонструкторСКД = Новый КонструкторСхемыКомпоновкиДанных(СКД);
КонструкторСКД.Редактировать(ЭтаФорма);
КонецПроцедуры
Процедура АлгоритмРаспределенияНУНажатие(Элемент)
СКД = АлгоритмНУ.Получить();
Если СКД = Неопределено Тогда
СКД = Новый СхемаКомпоновкиДанных;
КонецЕсли;
ВыбраннаяСКД = "АлгоритмНУ";
// Вызовем конструктор для интерактивного изменения СКД
КонструкторСКД = Новый КонструкторСхемыКомпоновкиДанных(СКД);
КонструкторСКД.Редактировать(ЭтаФорма);
КонецПроцедуры
Ну вот вроде бы и всё, осталось сохранить конфигурацию, обновить информационную базу, и написать собственный запрос на распределение, использую всё удобство и всю мощь формирования запросов СКД 😃
Пример запроса для "Алгоритм распределения БУ":
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет КАК СчетКт,
&Счет_90021 КАК СчетДт,
ХозрасчетныйОстатки.Субконто1 КАК СубконтоКт1,
ХозрасчетныйОстатки.Субконто2 КАК СубконтоКт2,
ХозрасчетныйОстатки.Субконто2 КАК СубконтоДт1,
ХозрасчетныйОстатки.Организация КАК Организация,
ХозрасчетныйОстатки.СуммаОстаток КАК Сумма,
&КонецПериода КАК Период,
"Закрытие Выполнение услуг" КАК Содержание
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&КонецПериодаГраница, Счет В ИЕРАРХИИ (&Счет_20), , Субконто2 В ИЕРАРХИИ (&СубконтоНГ)) КАК ХозрасчетныйОстатки
В приведенном коде возможно имеются некоторые ошибки, связанные с упрощением механизма работы, т.к. пример взят из рабочей базы, где был первоначально реализован проект. Но, тем не менее, я думаю, данная статья будет всё-таки полезна и принесет свою лепту в развитие метода доработки стандартной 1С.
Всем спасибо за прочтение и внимание, и извиняюсь, что статья довольно сжата (упускаются многие моменты выбора решения применения технологий).
PS
Спасибо за оставленные комментарии, в которых абсолютно верно было замечено, что здесь приведена только реализация, а вот когда и зачем этот механизм использовать не сказано.
Мысль реализовать подобное решение возникала уже давно, но раньше хватало возможностей всё необходимое вывернуть из стандартного механизма (хотя кое-что и приходилось дописывать в модулях). Но чем дальше, тем хуже... Сейчас работаю во франчайзи, встречаются различные конторы, и ,что самое поразительное, вопрос о себестоимости встает очень часто. И часто слышу следующее: "Хорошо, стандартный механизм работает, но мы по-другому производим распределение затратных счетов, как быть?". А что самое главное, ошибки в их методике нет, просто она, в основном, ориентирована на возможность собрать данные для финансовой отчетности (рентабельности не только производства в целом, а в отдельности по каждому направлению, продукции направления в разрезе всех затрат). Еще одно важное свойство - возможность ведения НЗП даже в бухгалтерии. При этом Вы полностью самостоятельно определяете по каким правилам это всё происходит. И заметим, что если в "1С:Бухгалтеия 2.0" еще можно сделать операции вручную, то уже в комплексной, при включенном РАУЗ, распределение затрат произвольным способом не представляется возможным.
Внедряя данный механизм на предприятии, мы получили большой плюс в уходе от ручного труда: планово-экономический отдел, также как и заместители главного бухгалтера, смогли отказаться от части своих excel-документов. Что значительно повышает достоверность данных, да и время на получение этих данных значительно сократилось. А значит, данный механизм, смог повысить эффективность работы предприятия в целом.
Но, как и всегда, есть и ложка дёгтя: для настройки и правильной работы механизма требуется не просто программист 1С, а программист, который хоть что-то понимает в бухгалтерском учете. А если конфигурация будет КА или УПП, то тут еще сложнее...