Отладка расчета себестоимости в ERP - просмотр изменений временных таблиц

09.09.20

Разработка - Инструментарий разработчика

Как уследить за изменениями в сотне временных таблиц на различных этапах выполнения расчета себестоимости. Тестировалось на 1С:ERP Агропромышленный комплекс 2 (2.4.12.75)

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Обработка для запуска расчета себестоимости с перепроведением проблемного документа
.epf 6,81Kb
52 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Перед прочтением рекомендую ознакомиться с выжимкой из описания типовых методов  расчета в этой статье: //infostart.ru/1c/articles/658048/

Для отладки расчета себестоимости будет очень удобно использовать методы сравнения данных в МВТ. Поясню. Весь расчет себестоимости - это формирование и перезапись временных таблиц. Их около 50 штук. Для того чтобы понимать, какие ВТ на каком этапе формируются, и какие данные в них меняются, я написал два метода и положил их в общий модуль.

На протяжении расчета во все методы передаётся структура ПараметрыРасчета, содержащая МенеджерВременныхТаблиц. Именно в нём и меняются ВТ, формируемые в разных этапах расчета. 
 

Функция ПолучитьОписаниеТаблицМВТ(МВТ, Параметры = Неопределено, ИмяПараметра = "") Экспорт
    
    ТаблицыМВТ = Новый ТаблицаЗначений;
    ТаблицыМВТ.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
    ТаблицыМВТ.Колонки.Добавить("КоличествоЗаписей", Новый ОписаниеТипов("Число"));
    ТаблицыМВТ.Колонки.Добавить("ТЗ");
    
    
    Для Каждого цВТ Из МВТ.Таблицы Цикл
        
        новСтрока = ТаблицыМВТ.Добавить();
        новСтрока.Имя = цВТ.ПолноеИмя;
        
        ТЗ = цВТ.ПолучитьДанные().Выгрузить();
        
        новСтрока.КоличествоЗаписей = ТЗ.Количество();
        новСтрока.ТЗ = ТЗ;
        
    КонецЦикла;
    
    ТаблицыМВТ.Сортировать("Имя");
    
    
    Если Параметры <> Неопределено И Не ПустаяСтрока(ИмяПараметра) Тогда
        Параметры.Вставить(ИмяПараметра, ТаблицыМВТ);
    КонецЕсли;
    
    
    Возврат ТаблицыМВТ;
    
КонецФункции
Функция СравнитьОписанияВТ(Описание1, Описание2, ТолькоОтличия = Истина) Экспорт
    
    ОтличияОписаний = Новый ТаблицаЗначений;
    ОтличияОписаний.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
    ОтличияОписаний.Колонки.Добавить("КоличествоЗаписей1", Новый ОписаниеТипов("Число"));
    ОтличияОписаний.Колонки.Добавить("КоличествоЗаписей2", Новый ОписаниеТипов("Число"));
    ОтличияОписаний.Колонки.Добавить("ЕстьВОписании1", Новый ОписаниеТипов("Булево"));
    ОтличияОписаний.Колонки.Добавить("ЕстьВОписании2", Новый ОписаниеТипов("Булево"));
    ОтличияОписаний.Колонки.Добавить("ДанныеОтличаются", Новый ОписаниеТипов("Булево"));
    ОтличияОписаний.Колонки.Добавить("ТЗ1");
    ОтличияОписаний.Колонки.Добавить("ТЗ2");
    
    Для Каждого цСтрокаОписания1 Из Описание1 Цикл
        
        новСтрока = ОтличияОписаний.Добавить();
        новСтрока.Имя = цСтрокаОписания1.Имя;
        новСтрока.ТЗ1 = цСтрокаОписания1.ТЗ;
        новСтрока.КоличествоЗаписей1 = цСтрокаОписания1.ТЗ.Количество();;
        новСтрока.ЕстьВОписании1 = Истина;
        
        СтрокиВ2Описании = Описание2.НайтиСтроки(Новый Структура("Имя", цСтрокаОписания1.Имя));
        
        Если СтрокиВ2Описании.Количество() = 0 Тогда
            новСтрока.ДанныеОтличаются = Истина;
        Иначе
            
            новСтрока.ЕстьВОписании2 = Истина;
            новСтрока.ТЗ2 = СтрокиВ2Описании[0].ТЗ;
            новСтрока.КоличествоЗаписей2 = новСтрока.ТЗ2.Количество();;
            
            
            Если новСтрока.КоличествоЗаписей1 <> новСтрока.КоличествоЗаписей2 Тогда
                новСтрока.ДанныеОтличаются = Истина;
                Продолжить;
            КонецЕсли;
            
            
            Для Каждого цКолонкаТЗ1 Из новСтрока.ТЗ1.Колонки Цикл
                Если новСтрока.ТЗ2.Колонки.Найти(цКолонкаТЗ1.Имя) = Неопределено Тогда
                    новСтрока.ДанныеОтличаются = Истина;
                    прервать;
                КонецЕсли;
            КонецЦикла;
            
            Для Каждого цКолонкаТЗ2 Из новСтрока.ТЗ2.Колонки Цикл
                Если новСтрока.ТЗ1.Колонки.Найти(цКолонкаТЗ2.Имя) = Неопределено Тогда
                    новСтрока.ДанныеОтличаются = Истина;
                    прервать;
                КонецЕсли;
            КонецЦикла;
            
            Если Не новСтрока.ДанныеОтличаются Тогда
                новСтрока.ДанныеОтличаются = Не ОбщегоНазначения.КоллекцииИдентичны(новСтрока.ТЗ1, новСтрока.ТЗ2);
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Для Каждого цСтрокаОписания2 Из Описание2 Цикл
        
        СтрокиВОписании = ОтличияОписаний.НайтиСтроки(Новый Структура("Имя", цСтрокаОписания2.Имя));
        
        Если СтрокиВОписании.Количество() = 0 Тогда
            новСтрока = ОтличияОписаний.Добавить();
            новСтрока.Имя = цСтрокаОписания2.Имя;
            новСтрока.ТЗ2 = цСтрокаОписания2.ТЗ;
            новСтрока.КоличествоЗаписей2 = цСтрокаОписания2.ТЗ.Количество();;
            новСтрока.ЕстьВОписании2 = Истина;
            новСтрока.ДанныеОтличаются = Истина;
        КонецЕсли;
        
    КонецЦикла;
    
    Если ТолькоОтличия Тогда
        ОтличияОписаний = ОтличияОписаний.Скопировать(Новый Структура("ДанныеОтличаются", Истина));
    КонецЕсли;
    
    ОтличияОписаний.Сортировать("Имя");
    
    Возврат ОтличияОписаний;
    
КонецФункции

Первый метод читает все ВТ из менеджера и возвращает таблицу значений с колонками:

  • Имя (имя временной таблицы), 
  • КоличествоЗаписей, 
  • ТЗ (непосредственно данные из временной таблицы).

Кроме того, этот метод может положить сформированную таблицу с описанием ВТ в любую структуру с произвольным ключом (параметры метода: Параметры, ИмяПараметра). Таким образом мы можем на любом этапе расчета создать "слепок" содержимого менеджера ВТ и положить его, например, в структуру "ПараметрыРасчета".

Второй метод позволяет сравнивать слепки, получившиеся в результате работы первого метода. В результате сравнения возвращается таблица, содержащая поля:

  • Имя (имя временной таблицы), 
  • КоличествоЗаписей1, 
  • КоличествоЗаписей2, 
  • ТЗ1 (непосредственно данные из таблицы первого слепка).
  • ТЗ2 (непосредственно данные из таблицы второго слепка).
  • ЕстьВОписании1 (признак того, что ВТ присутствует в первом слепке)
  • ЕстьВОписании1 (признак того, что ВТ присутствует во втором слепке)
  • ДанныеОтличаются (признак того, что Данные в таблицах с одинаковым именем отличаются - по количеству записей, или по значению полей, или по наличию таблиц)

Как этим пользоваться.
1. Запускаем расчет. Можно накидать внешнюю обработку для запуска

&НаСервере
Процедура ЗапуститьРасчетССНаСервере()
    ПараметрыЗапуска = Новый Структура;
    ПараметрыЗапуска.Вставить("АвтоматическоеТестирование", Ложь);
    ПараметрыЗапуска.Вставить("ВыполняетсяЗакрытиеМесяца", Ложь);
    ПараметрыЗапуска.Вставить("Дата", НачалоМесяца(Период));
    ПараметрыЗапуска.Вставить("МассивОрганизаций", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Организация));
    ПараметрыЗапуска.Вставить("МестоВызоваРасчета", "РасчетСебестоимостиКорректировкаСтоимости.Выполнить_РасчетПартийИСебестоимости");
        
    СхемаРасчета = РасчетСебестоимостиПрикладныеАлгоритмы.СхемаРасчетаПартий(ПараметрыЗапуска.Дата, ПараметрыЗапуска.МассивОрганизаций);
    Если СхемаРасчета.Количество() = 0 Тогда
        новСтрока = СхемаРасчета.Добавить();
        новстрока.Дата = КонецМесяца(ПараметрыЗапуска.Дата);
        новстрока.ИзмененоДокументов = 1;
        новстрока.Организации = ПараметрыЗапуска.МассивОрганизаций;
    КонецЕсли;
    ПараметрыЗапуска.Вставить("СхемаРасчета", СхемаРасчета);
    
    РасчетСебестоимости.РассчитатьВсе(ПараметрыЗапуска);

КонецПроцедуры


Обработка во вложении, там она ещё перепроводит проблемный документ перед расчетом.
2. Тормозим отладку перед интересующим нас методом.
3. В табло пишем:

НашОбщийМодуль.ПолучитьОписаниеТаблицМВТ(ПараметрыРасчета.МенеджерВременныхТаблиц, ПараметрыРасчета, "ТаблицыПередВыполнениемЭтапа")


4. После того как выражение вычислилось, в структуре ПараметрыЗапуска появились данные с ключом "ТаблицыПередВыполнениемЭтапа", комментим (или удаляем из табло) выражение из пункта №3, чтобы данные не перезаписались при следующих шагах
5. Выполняем интересующий нас этап и кладём его данные в структуру с новым ключом. Для этого опять пишем выражение в табло:

НашОбщийМодуль.ПолучитьОписаниеТаблицМВТ(ПараметрыРасчета.МенеджерВременныхТаблиц, ПараметрыРасчета, "ТаблицыПослеВыполненияЭтапа")


6. Сравниваем эти описания, выполняя в табло код: 

НашОбщийМодуль.СравнитьОписанияВТ(ПараметрыРасчета.ТаблицыПередВыполнениемЭтапа, ПараметрыРасчета.ТаблицыПослеВыполненияЭтапа)


В результате имеем Таблицу, содержащую отличия. Открыть её можно прямо из табло, нажав F2.
Также можно вместо этапов 5,6 просто идти по коду, вычисляя в табло выражение:
 

НашОбщийМодуль.СравнитьОписанияВТ(ПараметрыРасчета.ТаблицыПередВыполнениемЭтапа, НашОбщийМодуль.ПолучитьОписаниеТаблицМВТ(ПараметрыРасчета.МенеджерВременныхТаблиц))

Таким образом можно на любом этапе понять, какие ВТ сформировались или изменились.

Вступайте в нашу телеграмм-группу Инфостарт

Расчет себестоимости Управление предприятием 2 ERP

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

24900 руб.

20.08.2024    61110    325    160    

295

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    246970    1359    421    

1132

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

15250 руб.

25.08.2025    43115    89    27    

102

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Библиотека стандартных подсистем Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22570 руб.

06.10.2023    35646    90    40    

112

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

17000 руб.

10.11.2023    23786    88    42    

100

Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9500 руб.

17.05.2024    50003    173    63    

206

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.

36600 руб.

28.08.2025    6587    2    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Date 8 07.09.21 05:18 Сейчас в теме
Добрый день. Интересная задумка. Вот только я столкнулся с тем, что функция "СравнитьОписанияВТ()" ничего не возвращает, а структура "ПараметрыРасчета" меняет тип на что-то не понятное. Не сталкивались с таким?
Прикрепленные файлы:
2. doom2good 152 07.09.21 10:04 Сейчас в теме
(1)
функция "СравнитьОписанияВТ()" ничего не возвращает

Сталкивался. У вас ооочень много данных, на сравнение таблиц требуется много времени. Просто ждите, когда появится значение (произойдёт вычисление выражения). И имейте в виду, если сделаете шаг, то вычисляться будет заново. Так что комментируйте //выражение, чтобы не подвисать на ненужных шагах.
Можете доработать метод чтобы сравнивалось например только количество строк, это значительно ускорит выполнение.

(1)
структура "ПараметрыРасчета" меняет тип на что-то не понятное

С таким не сталкивался
3. AntonFAKOFF 02.12.22 00:06 Сейчас в теме
Можете подробнее описать процесс отладки? В какой момент функции вызывать, сколько пробовал, результат не совсем тот на который я рассчитывал.
4. AntonFAKOFF 02.12.22 00:23 Сейчас в теме
Я ожидаю увидеть результат запроса, в котором можно посмотреть полученные позиции с ошибками из регистров чтобы лучше понимать как их исправить.
5. doom2good 152 02.12.22 00:25 Сейчас в теме
(4) С помощью этих штук вы можете просматривать содержимое временных таблиц, сравнивать, что изменилось. А уж как вы это будете использовать - тут я не подскажу
Для отправки сообщения требуется регистрация/авторизация