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

09.09.20

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

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

Скачать файлы

Наименование Файл Версия Размер
Обработка для запуска расчета себестоимости с перепроведением проблемного документа
.epf 6,81Kb
39
.epf 6,81Kb 39 Скачать

Перед прочтением рекомендую ознакомиться с выжимкой из описания типовых методов  расчета в этой статье: //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

См. также

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

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    122268    673    389    

715

SALE! 25%

Infostart PrintWizard

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

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7323    22    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8000 руб.

10.11.2023    3567    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177771    1074    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99364    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18128    6    8    

40

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28115    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23605    15    15    

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

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

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

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