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

09.09.20

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Обработка для запуска расчета себестоимости с перепроведением проблемного документа
.epf 6,81Kb
44
44 Скачать (1 SM) Купить за 1 850 руб.

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

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159439    872    399    

861

SALE! 15%

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

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

8400 7140 руб.

20.08.2024    7772    55    22    

66

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

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

9360 руб.

17.05.2024    23438    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10431    36    24    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15401    35    7    

70

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    187985    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17303    6    32    

42

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

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7695    8    35    

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

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

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

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