Эта небольшая заметка позволяет раскрыть потенциал работы с консолью компоновки данных (ККД) в повседневной работе программиста или аналитика.
Наверняка многие сталкивались с задачами типа: по-быстрому поменять реквизит документа по какому-либо правилу, загрузить в базу данные из какого-либо файла, делать различные «переброски», «переливки», анализировать расхождения, ошибки в начислениях, быстро понять «откуда в отчете берется цифра» и прочее, прочее. Зачастую мы используем для решения этих задач небольшие фрагменты кода, помещенные во временные внешние обработки. При этом полученные в результате работы этих фрагментов кода данные нигде не сохраняются, да и сами фрагменты и обработки теряются. И когда вдруг через время возникает необходимость сделать нечто похожее (а возможно и тоже самое) приходится все делать заново. Консоль компоновки данных позволяет решить многие эти проблемы. С помощью нее можно выполнять простые ( и не очень) фрагменты кода, не требующие отладки и конфигуратора. При этом полученные в результате работы данные (например заполненная таблица значений) могут сохраняться. И будут доступны при следующем открытии консоли в этой или в любой другой базах. Фрагменты кодов, запросы, схемы компоновки могут быть классифицированы. Кроме того доступна история выполнения запросов и фрагментов кода. Все настройки, данные и исходные коды хранятся в одной папке. Закинув на флешку эту папку, вы сможете весь багаж своих наработок с легкостью использовать на разных компьютерах. Объекты и запросы вместе с данными отображаются на интуитивно понятных закладках. При этом можно настроить отборы этих закладок, и не отображать то что актуально например для бухгалтерии 8.1 в торговле 8.2. Итак, перейдем к обещанным практическим примерам.
Иногда некоторые отчеты даже в стандартных конфигурациях содержат в себе элементы полного экзерцизма: многокилометровые запросы, сотканные по составному принципу, временные таблицы, внешние данные, заполняемые кодом, куча параметров, устанавливаемых в разных местах. И все это объединено схемой компоновки данных. А там где сложно - там и глюки. Чтобы понять что происходит в таких отчетах, какая цифра откуда берется, перво-наперво надо подключить возможность отладки запросов, построителей и СКД с помощью консоли компоновки данных, прописав в одно из общих модулей функцию ОтладкаККД:
Функция ОтладкаККД(Объект,НастройкиСКД = Неопределено,ВнешниеДанные = Неопределено) Экспорт ККД = ВненшниеОбработки.Создать("ПутьКОбработкеНаДискеКонсольКомпоновкиДанных.epf") Форма = ККД.ПолучитьФорму("ФормаНастройки"); Если Форма = Неопределено Тогда Возврат Ложь; КонецЕсли; Форма.ВнешниеДанные = ВнешниеДанные; Форма.ОбъектДляОтладки = Объект; Форма.НастройкиСКДДляОтладки = НастройкиСКД; Форма.Открыть(); Возврат Истина; КонецФункции
еперь, чтобы отладить например СКД, нужно установить точку останова перед формированием схемы и написать в редаткоре выражений:
Здесь первый параметр -отлаживаемая схема. Другой параметр - настройки компоновщика. Внешних данных нет.
Дожидаемся появления Значение = Истина. После этого продолжаем отладку и видим в предприятии открытую форму ККД со считанной СКД со всеми настройками и внешними данными (Либо запрос или построитель отчета, если отлаживались они). Дальше дело техники – выясняем какой запрос генерирует нужную информацию и двойным щелчком переходим из формы СКД в форму Запросов. Где выполняя и модифицируя отдельный запрос гораздо проще найти ошибку или понимание того, что откуда берется.
Аналогичным образом можем отладить составные запросы заполненными временными таблицами. При отладке в консоль передается и менеджер временных таблиц. Посмотреть данные, содержащиеся во временных таблицах можно просто выделив ее имя в коде нажать кнопку «выполнить».
ПостроительОтчета и ПостроительЗапроса тоже можно раскрыть в консоли со всеми установленными параметрами, отборами, группировками, полями
Допустим у нас есть список заказов покупателей в виде
Заказ покупателя ЦМ000003657 от 29.07.2011 12:13:43 |
Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |
Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |
Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |
Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |
И так еще тысяча строк. Нам надо поменять в них подразделение. Для ускорения процесса можно пойти на хитрость. Просто копируем столбец из экселя в новую закладку консоли запростов, выбираем Дополнительно – установить разделители строк (это действие предназначено на самом деле для очистки фрагментов запроса, взятых в кофигураторе и копированию готовых фрагментов обратно)
Получаем
|Заказ покупателя ЦМ000003657 от 29.07.2011 12:13:43 |Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10
Копируем все в буфер обмена, переходим в форму объектов и на новой вкладке пишем
Данные = « Сюда вставляем то что в буфере обмена »;
Немного корректируем первую строчку и получаем
Данные = "Заказ покупателя ЦМ000003657 от 29.07.2011 12:13:43 |Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10 |Заказ покупателя ЦМ000003738 от 29.07.2011 18:42:10";
Это готовая строка, из которой теперь очень просто вытащить номера заказов. По ним получим документы и произведем нужные модификации.
Ниже пишем код:
Для К = 1 По СтрЧислоСтрок(Данные) Цикл //Перебираем строки Стр = СтрПолучитьСтроку(Данные,К);//Берем строку, Стр = СтрЗаменить(Стр,"", Символы.ПС); //заменяем пробелы на перевод строки, Номер = СтрПолучитьСтроку(Стр,3);//в полученной составной строке берем номер (3-е слово) Док = Документы.ЗаказПокупателя.НайтиПоНомеру(Номер,ТекущаяДата()); //Ищем документ Если НЕ Док.Пустая() Тогда ДокОбъект = Док.ПолучитьОбъект(); ДокОбъект.Подразделение = &Подразделение; // Берем заданное в параметрах подразделение ДокОбъект.Записать(); #Итератор //Вывод числа повторений цикла КонецЕсли; КонецЦикла;
Видео, демонстрирующее вышеизложенное:
Для упрощения предположим что у нас есть две базы с одинаковой структурой –копия на вчерашний день и актуальная база. Допустим кто-то нечаянно очистил цены по определенной номенклатуре. В этой ситуации нет ничего страшного, если конечно есть адекватная копия. Вопрос только в быстром переносе нужных данных.
Итак, в копии делаем запрос в форме запросов, который выбирает нужные данные с нужным отбором
Полученную таблицу результата помещаем в объект (Поместить в объект на закладке результата запроса.) Выбираем нужный объект, на закладке результата ставим галку «сохранить». Все данные готовы для выгрузки. Закрываем ККД в копии (после этого все данные будут сброшены на диск)
Открываем консоль в актуальной базе. Видим наш объект с нужными нам данными на закладке «Таблица значений». Теперь их остается только загрузить.
В исходном коде этого объекта пишем код загрузки регистра сведений через набор записей.
НаборЗаписей = РегистрСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Номенклатура.Установить(&Номенклатура); НаборЗаписей.Прочитать(); Для Каждого СтрТаб Из #ТаблицаЗначений Цикл //Читаем данные из таблицы значений ЗаполнитьЗначенияСвойств(НаборЗаписей, СтрТаб); КонецЦикла; НаборЗаписей.Записать();
Все! Никаких внешних файлов для обмена, COM Соединений – 5 минут и готово.