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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *