Реализация расшифровки в Системе Компоновки Данных




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

59 Comments

  1. coder1cv8

    Спасибо за плюсы и комментарии! 🙂

    Reply
  2. Ish_2

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

    «Как найти поля всех родителей выбранной ячейки по строкам и по столбцам ?».

    Например для того ,чтобы построить отбор для подчиненного отчета.

    Было бы полезно , если бы Вы в следующей статье раскрыли бы этот вопрос.

    Reply
  3. kadr

    >> 2

    Применительно к примеру примерно так

    Массив = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьРодителей()

    Массив[0] — родитель по горизонтали

    Массив[1] — родитель по вертикали

    а во как получить настройки СКД при наличии нескольких СКД в отчете (обработке)

    СхемаКомпоновкиДанных = ПолучитьМакет(«СтоимостнаяОценкаСклада»);

    ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);

    КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);

    Теперь в настройках только отборы

    Группировки подобным образом получить не удалось 🙁

    Reply
  4. coder1cv8

    (3) Ну это легко! )

    Код
    СхемаКомпоновкиДанных1 = ПолучитьМакет("СтоимостнаяОценкаСклада");
    КомпоновщикНастроек1=Новый КомпоновщикНастроекКомпоновкиДанных();
    КомпоновщикНастроек1.ЗагрузитьНастройки(СхемаКомпоновкиДанных1.НастройкиПоУмолчанию);
    Настройки=КомпоновщикНастроек1.Настройки;
    

    Показать полностью

    Reply
  5. coder1cv8

    +(4) Ну что с отображением кода творится?! Хоть тегами не пользуйся! :((

    Reply
  6. Ish_2

    (3) Ответ безусловно верный . Если бы вопрос был о родителях при одноуровневой группировке. Если речь идет ПОЛЯХ ВСЕХ родителей ,то

    1.Предполагаются многоуровневые группировки неизвестного уровня.

    2.Значения массива , полученного методом НайтиРодителей() могут иметь различные типы и на определенных уровнях могут не иметь полей (неприменим метод ПолучитьПоля()).

    Таким образом , предполагается процедура.

    Я предположил , что это не частный (узкий) вопрос , и его можно рассмотреть в задаче № 4.

    Reply
  7. kadr

    (4)

    не так то все и легко 😉

    Код
       СхемаКомпоновкиДанных1 = ПолучитьМакет("СтоимостнаяОценкаСклада");
       КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных1.НастройкиПоУмолчанию);
       Настройки=КомпоновщикНастроек.Настройки;
       
       ФормаНастройки = ПолучитьФорму("ФормаНастройки");
       ФормаНастройки.Открыть();
    

    Показать полностью

    Отбор загружается, группировок нет.

    ФормаНастройки — стандартная форма настройки СКД.

    Основная схема компоновки данных отчета не указана. При указании основной СКД отчета группировки остаются от основной СКД, а отбор от загружаемой

    (6) Организовать рекурсивную процедуру обхода родителей

    Reply
  8. coder1cv8

    (7) «КомпоновщикНастроек» — это расширение формы отчета, не надо так переменную называть! 😉

    Reply
  9. coder1cv8

    +(8) В том смысле, что завидите отдельный компоновщик, как у меня в примере и всё будет работать…

    Reply
  10. kadr

    С учетом (8)

    Выставил макет СКД отчета "СтоимостнаяОценкаСклада"

    Код
       СхемаКомпоновкиДанных1 = ПолучитьМакет("СтоимостнаяОценкаСклада");
       КомпоновщикНастроек1=Новый КомпоновщикНастроекКомпоновкиДанных();   
       КомпоновщикНастроек1.ЗагрузитьНастройки(СхемаКомпоновкиДанных1.НастройкиПоУмолчанию);   
          
       Сообщить(КомпоновщикНастроек1.Настройки.ДоступныеПоляВыбора.Элементы.Количество());  // результат 0
       Сообщить(КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы.Количество()); // результат 11
    
    

    Показать полностью

    В созданном нами компоновщике доступных полей выбора — 0

    В в расширении формы отчета доступных полей выбора — 11

    Доступные поля выбора не загружаются с настройками??

    Reply
  11. coder1cv8

    (10) Хм… Ну вот выдрал пример из своего отчета, где по расшифровке выводятся движения по товару/складу с помощью вложенной схемы:

    Процедура ДвиженияПоТовару(Номенклатура,Склад)

    ТабДок=Новый ТабличныйДокумент;

    СКД_Расшифровка=СхемаКомпоновкиДанных.ВложенныеСхемыКомпоновкиДанных[0].Схема;

    КомпоновщикНастроек_Расшифровка=Новый КомпоновщикНастроекКомпоновкиДанных();

    КомпоновщикНастроек_Расшифровка.ЗагрузитьНастройки(СКД_Расшифровка.НастройкиПоУмолчанию);

    Настройки=КомпоновщикНастроек_Расшифровка.Настройки;

    // Установим параметры

    Параметры=Настройки.ПараметрыДанных.Элементы;

    ПараметрНоменклатура=Параметры.Найти(«Номенклатура»);

    ПараметрНоменклатура.Значение=Номенклатура;

    ПараметрНоменклатура.Использование=Истина;

    ПараметрСклад=Параметры.Найти(«Склад»);

    ПараметрСклад.Значение=Склад;

    ПараметрСклад.Использование=Истина;

    КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;

    МакетКомпоновкиДанных=КомпоновщикМакета.Выполнить(СКД_Расшифровка,Настройки);

    ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;

    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);

    ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

    ПроцессорВывода.УстановитьДокумент(ТабДок);

    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

    ТабДок.ТолькоПросмотр=Истина;

    ТабДок.ОтображатьСетку=Ложь;

    ТабДок.ОтображатьЗаголовки=Ложь;

    ТабДок.ФиксацияСверху=1;

    ТабДок.Показать(«Движения по товару <«+Номенклатура+»>»);

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

    вот так всё работает, 100%

    Reply
  12. kadr

    строка кода

    СКД_Расшифровка=СхемаКомпоновкиДанных.ВложенныеСхемыКомпоновкиДанных[0].Схема;

    предполагает, что у Вас заполнена основная СКД для отчета и Вы используете расширение ОтчетОбъект.СхемаКомпоновкиДанных.

    Посмотрите как отработает тот же код если очистить основную СКД отчета и загрузить макет в коде

    СхемаКомпоновкиДанных1 = ПолучитьМакет(ИмяВашегоМакетаСКД)

    СКД_Расшифровка=СхемаКомпоновкиДанных1.ВложенныеСхемыКомпоновкиДанных[0].Схема;

    Reply
  13. coder1cv8

    (12) Насколько я понимаю, между схемой полученной из макета и вложенной схемой, не должно быть принципиальных отличий…

    Reply
  14. coder1cv8

    Вообще, есть в СКД некоторые глюки… В частности, заметил, что может «отваливаться» как сама схема, так и форма настроек. В таком случае помогает только пересоздание отчета.

    Reply
  15. kadr

    (13) также обратил внимание, что при заполненном свойству основная СКД отчета все работает нормально, а при программной обработке остается только отбор и выбранные поля

    Reply
  16. kadr

    Вот где собака порылась!!!

    перед загрузкой настроек во вновь созданный КомпоновщикНастроек его надо инициализировать

    СхемаКомпоновкиДанных = ПолучитьМакет(ИмяМакета);
    _КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
    _КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
    _КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    
    
    Reply
  17. coder1cv8

    (16) Запомним!

    Reply
  18. СергейКа

    Как раз появилась задача с изменением стандартной расшифровки СКД 🙂 Только хотел разбираться.

    Reply
  19. artbear

    А кто-нибудь смотрел реализацию универсальных отчетов и шаблонов для них на базе СКД в последних версиях БП и ЗУП ?

    Сделано очень красиво и удобно для пользователя.

    Очень легко портируется в другие конфигурации.

    Я где-то минут за 20 перенес универсальный отчет + шаблон + все необходимое в самописную конфу для 8.1

    Reply
  20. coder1cv8

    (19) Да, молодцы. Обратил внимание на реализацию формы настроек, штатная — очень уж мудреная для пользователя. Да и запросы в ЗУП, которые были на несколько страниц, на порядок легче читать стало!…

    Reply
  21. СергейКа

    3 пример некорректен. По крайней мере у меня получается : если выбирается действие из произвольного списка, то ОбработкаРасшифровки.Выполнить() возвращает «Непределено»… Т.е. уже не заходит в условие вывода отчета…

    Reply
  22. coder1cv8

    (21) В примере, дополнительное действие — это не изменение настроек и (или) вывод отчета, а какое-то другое действие не связанное с выводом, например открытие какой-либо формы, обработки.

    Так что всё корректно, опять же в пределах примера )

    Reply
  23. СергейКа

    (22) Точно 🙂 Я чё-то строчку «Иначе» пропустил 🙂

    Reply
  24. artbear

    Кто-нибудь знает ответ на еще один подводный или надводный камень в СКД?

    http://infostart.ru/forum/forum14/topic9440/messages/

    Reply
  25. katzo

    Люди, спасите! Ну никак не могу настроить отбор вложенной схемы, чтобы детализировать общий отчет… У меня процедурка, которая данные для отбора выглядит так:

    &НаКлиенте

    Функция ПолучитьРекурсивноСтруктуруОтбора(ТекущееПоле, СтруктураОтбора = Неопределено)

    Если СтруктураОтбора = Неопределено Тогда

    СтруктураОтбора = Новый Структура;

    КонецЕсли;

    Для каждого ТекЭл Из ТекущееПоле.ПолучитьПоля() Цикл

    СтруктураОтбора.Вставить(ТекЭл.Поле, ТекЭл.Значение);

    КонецЦикла;

    Для каждого ТекЭл Из ТекущееПоле.ПолучитьРодителей() Цикл

    Если ТипЗнч(ТекЭл) = Тип(«ЭлементРасшифровкиКомпоновкиДанныхПоля») Тогда

    ПолучитьРекурсивноСтруктуруОтбора(ТекЭл, СтруктураОтбора);

    ИначеЕсли ТипЗнч(ТекЭл) = Тип(«ЭлементРасшифровкиКомпоновкиДанныхГруппировка») Тогда

    Сообщить(«Группировка: » + ТекЭл.Группировка);

    Иначе

    Сообщить(«Неизвестный элемент: » + ТекЭл);

    КонецЕсли;

    КонецЦикла;

    Возврат СтруктураОтбора;

    КонецФункции // ПолучитьРекурсивноСтруктуруОтбора()

    Вызывается она так:

    ТекущееПоле = ДанныеРасшифровки.Элементы[Расшифровка];

    СтруктураОтбора = ПолучитьРекурсивноСтруктуруОтбора(ТекущееПоле);

    В итоге значения полей (строк и колонок) получаю спокойно, а из группировок не могу никак вытащить ни название группировки (мне нужно именно получить путь к данным, а не ничего не значащее «ГруппировкаN»), ни значения, которые потом надо установить в отбор во вложенной схеме… Может я что не так делаю? Я только-только начал программить под СКД, 100 грамм не помогли, а тяжелые наркотики я не хочу употреблять, чтобы в этом разобраться:(

    Reply
  26. jerer

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

    Функция ПолучитьРекурсивноСтруктуруОтбора(ТекущееПоле, СтруктураОтбора = Неопределено)
    Если СтруктураОтбора = Неопределено Тогда
    СтруктураОтбора = Новый Структура;
    КонецЕсли;
    
    Если ТипЗнч(ТекущееПоле) = Тип(«ЭлементРасшифровкиКомпоновкиДанныхПоля») Тогда
    Для Каждого ТекЭл Из ТекущееПоле.ПолучитьПоля() Цикл
    СтруктураОтбора.Вставить(ТекЭл.Поле, ТекЭл.Значение);
    КонецЦикла;
    КонецЕсли;
    
    Для Каждого ТекЭл Из ТекущееПоле.ПолучитьРодителей() Цикл
    ПолучитьРекурсивноСтруктуруОтбора(ТекЭл, СтруктураОтбора);
    КонецЦикла;
    
    Возврат СтруктураОтбора;
    КонецФункции
    
    

    Показать

    Reply
  27. jerer

    Правда, тут два раза одни и те же значения добавляются, «Вставить» помогает, но типа не оптимально.

    Reply
  28. e.kogan

    Вопрос автору: есть ли способ получить путь к данным поля, выбранного для расшифровки?

    Reply
  29. primat

    Привет! Подскажите, пожалуйста. Формирую отчет в СКД программно, и расшифровка совсем не работает. То есть привязанная к табличному полю функция на действие «Обработки расшифровки» просто не срабатывает.

    Вот так формирую отчет:

    ЭлементыФормы.Результат.Очистить();

    ИсполняемыеНастройки = КомпоновщикНастроек.Настройки;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ИсполняемыеНастройки);

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ,Расшифровка);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

    ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);

    ПроцессорВывода.НачатьВывод();

    Пока Истина Цикл

    ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();

    Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда

    Прервать;

    КонецЕсли;

    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);

    КонецЦикла;

    ПроцессорВывода.ЗакончитьВывод();

    ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(0);

    При инициации процессора компоновки данных можно задать переменную, в которую «будут выводиться результаты компоновки данных» (это по синтакс-помощнику). Я написал — Расшифровка, не работает.

    А что там надо написать, какую переменную создать, чтобы расшифровка срабатывала, кто-нибудь знает?

    Reply
  30. primat

    Нашел ответ. Надо было добавить третий параметр ДанныеРасшифровки в КомпоновщикМакета.Выполнить() и в ПроцессорКомпоновкиДанных.Инициализировать(). После этого можно менять расшифровку как угодно.

    Reply
  31. coder1cv8

    (28) Не совсем понятен вопрос… По-моему «ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле» — это и есть путь к данным, т.е. имя поля в компоновке.

    Reply
  32. e.kogan

    (31) Нет-нет, не имя того поля, ПО которому я щёлкнула, а имя того поля, которое я выбрала для расшифровки текущего!

    Т.е. «Расшифровать», и нужно то поле, которое было выбрано в диалоге «Выбор поля»!

    Reply
  33. e.kogan

    32 + Или хотя бы по какому принципу формируется список полей в диалоге «Выбор поля», чтобы это сымитировать…

    Reply
  34. e.kogan

    32+

    Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка=Ложь;
    ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    текПоле=ДанныеРасшифровки.Элементы[Расшифровка]; //здесь вылетает
    //тут ещё много кода
    КонецПроцедуры

    При повторном щелчке по исходной таблице (после выполнения расшифровки) процедура вылетает на указанной строке с ошибкой:

    {Форма.ФормаОтчета(178)}: Значение, соответствующее ключу, не задано

    текПоле=ДанныеРасшифровки.Элементы[Расшифровка];

    В отладчике значение переменной Расшифровка в обоих случаях одинаково, а вот ДанныеРасшифровки — разные, хотя клик по одному и тому же полю в одной и той же ячейке. Чем бороть?

    Reply
  35. e.kogan

    (34) Сама нашла, у меня ДанныеРасшифровки менялись (неявно) в дальнейшем коде.

    Reply
  36. IgorXml

    Мой код для СКД расшифровка на 8.2. Может сгодиться кому 😀 :

    &НаСервере
    Функция ПолучитьURLСхемы()
    ОсновнаяСхемаКомпоновкиДанных=Отчеты.ПоПредметам.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);
    URLСхемы = ПоместитьВоВременноеХранилище(ОсновнаяСхемаКомпоновкиДанных);
    Возврат URLСхемы;
    КонецФункции
    
    &НаКлиенте
    Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    URLСхемы=ПолучитьURLСхемы();
    ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(URLСхемы);
    Обработка=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,ИсточникДоступныхНастроек);
    Результат=Неопределено;
    Параметр=Неопределено;
    ДоступныеДействия = Новый Массив;
    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
    Обработка.ВыбратьДействие(Расшифровка,Результат,Параметр,ДоступныеДействия,);
    П =    Новый Структура(«Ключ», Параметр);
    Форма = ПолучитьФорму(«Справочник.Предметы.ФормаОбъекта», П);
    Форма.Открыть();
    ПриОткрытии(ложь);
    КонецПроцедуры
    

    Показать

    Reply
  37. bela88

    А у меня следующая ситуация и разобраться в ней пока не получается.

    Создаю отчет по результативности звонков. Пример выводимых данных в приклепленном файле.

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

    ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьРодителей()[0].ПолучитьПоля().Найти(«Мероприятие»)

    то значение мероприятия известно, когда выбранная ячейка находится в строчке «Семинар УТ», если же нажимаю на любую другую ячейку, привязку к данной группировке по семинару не могу найти.

    Если кто-нибудь сталкивался с подобной ситуацией, подскажите:)

    Reply
  38. kitt

    плюсую, надеюсь будет продожение. Хотел бы посмотреть разных примеров с расшифровкой с помощью вложенных схем

    Reply
  39. GreenFox

    (37) Поддерживаю — как расшифровку распространить на всю строку? Мне надо как то при клике на любое поле в строке получить значение в конкретной ячейке в этой строке.

    Reply
  40. evn-zorin

    Это плюс.

    Reply
  41. PrinzOfMunchen

    (39) GreenFox, задаюсь тем же вопросом.

    Reply
  42. c1nil

    Отличная статья. Спасибо!

    Reply
  43. Eldjer

    (41) PrinzOfMunchen, уже почти день ковыряюсь над расшифровкой со всей строкой =

    Reply
  44. grand.pers

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

    {Отчет.ОСВ1.Форма.ФормаОтчета.Форма(15,49)}: Слишком много фактических параметров (СкомпоноватьРезультат)

    СкомпоноватьРезультат(ЭлементыФормы.Результат,<<?>>ДанныеРасшифровки); // выводим результат (Проверка: Тонкий клиент)

    Почему? И что нужно сделать, чтобы все работало?

    Reply
  45. minimaxpo

    Всем здравствуйте.

    Такой вопрос: настроены две вложенные схемы к основной СКД (схемы идентичные основной, но добавлен параметр для отбора в виртуальной таблице) . Выводятся в отчет последовательно, как 3 отдельных отчета. Так вот как понять к какой СКД относится элемент расшифровки? Т.е., в зависимости от ячейки, расшифровку которой нужно получить, необходимо определить в какой СКД эта ячейка выведена.

    Reply
  46. sokir

    На упр формах никак не могу подобраться к ДанныеРасшифровки.

    Пытаюсь получить через ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки) — пишит «Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа».

    На стороне сервера ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки) работает, но надо на стороне клиента.

    Хелп!

    Reply
  47. Spacer

    (46) sokir, Надо на стороне сервера вытаскивать все что нужно из данных расшифровки.

    Помещать полученные данные скажем в фиксированный массив или в фиксированную структуру,

    и возвращать на клиент.

    Reply
  48. m1_1976

    самая первая строка не работает

    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(<<?>>СхемаКомпоновкиДанных)); (Проверка: Тонкий клиент)

    почему, кто подскажет…

    Я «на клиенте.» Но и в примере «на клиенте»!

    Reply
  49. IgorXml

    Для обычных конф. где не подходит расшифровка из «Шаблона 1С» самое простое это:

    Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    //***Типовой кусок кода ***(
    //ДопСписок = Новый СписокЗначений;
    //ТиповыеОтчеты.ОбработкаРасшифровкиТиповогоОтчета(Расшифровка, СтандартнаяОбработка, ЭтотОбъект, ЭтаФорма, ДопСписок);
    //
    ////ТиповыеОтчеты.СтандартнаяОбработкаРасшифровкиТиповогоОтчета(ОтчетОбъект, ЭтаФорма, Расшифровка, СтандартнаяОбработка);
    //***)
    Попытка
    Ссылка=ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
    Ссылка.ПолучитьФорму().Открыть();
    СтандартнаяОбработка = Ложь;
    Исключение
    ДопСписок = Новый СписокЗначений;
    //ТиповыеОтчеты.ОбработкаРасшифровкиТиповогоОтчета(Расшифровка, СтандартнаяОбработка, ЭтотОбъект, ЭтаФорма, ДопСписок);
    ТиповыеОтчеты.СтандартнаяОбработкаРасшифровкиТиповогоОтчета(ОтчетОбъект, ЭтаФорма, Расшифровка, СтандартнаяОбработка);
    КонецПопытки;
    КонецПроцедуры
    

    Показать

    Reply
  50. jaroslav.h

    (36) Igor2010, привет, подскажи будь добре, у меня пустой результат после расшифровки выходит

    http://www.forum.mista.ru/topic.php?id=776248

    Reply
  51. romku

    (11) спасибо за пример. Очень помогло.

    Reply
  52. dima_home

    (30)

    Нашел ответ

    Тоже весь интернет перерыл… везде не полные данные.

    СПАСИБО.

    Reply
  53. korchak

    А как ограничить вывод (показ) или удалить, на худой конец, некоторые доступные поля, которые есть в диалоге выбора поля при расшифровке ячейки?

    Команда «Расшифровать…», вызываемая или двойным кликом по ячейке или через контекстное меню. В открывшейся форме диалога «Выбор поля» необходимо скрыть некоторые поля.

    Reply
  54. AKV77

    Спасибо

    Reply
  55. 7OH

    (53) Тоже ищу методы удаления ненужных пунктов контекстного меню.

    Двойной клик стандартной обработкой убирается (и настраивается тоже).

    А как изменить состав меню, которое вылетает по правой кнопке ?

    Кто знает — направьте почитать.

    Reply
  56. sokir

    Расшифровка формируется в этом же окне.

    Сделал так

    ФормаРасш = ПолучитьФорму(, , новый УникальныйИдентификатор);
    ФормаРасш.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиРасш);         // загружаем настройки
    ФормаРасш.СкомпоноватьРезультат(ФормаРасш.ЭлементыФормы.Результат, ФормаРасш.ДанныеРасшифровки);     

    Открывается новое окно и в нем расшифрованное вывелось, но сбиваются настройки первой (главной) формы.

    Конечно можно через отч = отчеты.ххх.создать, но это может быть и внешняя.

    Как правильнее всего отрыть расшифровку в новом окне?

    И еще для расшифровки я хочу применить другой вариант (другая структура вывода). Как в этом случае быть?

    Reply
  57. user903133

    Добрый день

    Reply
  58. 7OH

    (57) ОбработкаРасшифровки

    СтандартнаяОбработка = Ложь;

    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));

    ОбработкаРасшифровки.Расшифровать(

    а тут почитайте что туда передать

    Reply
  59. mrm1212

    Скажите, а при выполнении какого действия «Настройки» будут не равны «Неопределено»??? что-то не совсем пойму, почему-то у меня они всегда равны «Неопределено».

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *