Декомпиляция элементов формы для 8.2 для обычных форм (не управляемых).




Принцип обмена данными из 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='\

99 Comments

  1. Istur

    Декомпиляция отдельных элементов формы и самой формы в общем, для формирования кода для динамического вывода реквизитов.

    Перейти к публикации

    Reply
  2. German

    Что с определением цветов и шрифтов из стиля? 🙂

    Знаю только одну обработку в которой это реализовано.

    Reply
  3. Istur

    (1) Нет, не реализовано. Мне пока это не нужно.

    Reply
  4. Поручик

    (2) Добавь в описание, только для обычных форм.

    Reply
  5. Istur

    (3) Сделал.

    Reply
  6. ValeriTim

    (1) какая обработка это делает ?

    Reply
  7. German

    (5) Ei полное (ВЫПОЛНЯЕМОЕ) перобразование, позволяющее скопировать форму

    Reply
  8. vasiliy_b

    Да, такую бы обработку для управляемых форм!

    Reply
  9. alekseineputin

    Всё здорово, помогает экономить время на динамическом добавлении элементов в форму.

    Плюс однозначно 😉

    Reply
  10. Поручик

    (8) Нет, всё это знать не обязательно. Для этих целей есть СП, мануалы, шаблоны кода. Главное знать что искать и как искать.

    Reply
  11. alekseineputin

    (9) Ладно, не нападай 🙂 От шаблонов кода очень часто остаются куски причудливой формы 😀 Или я после НЕ тех программистов работал 😉

    Reply
  12. woozee

    Понять не могу для чего она =) И чем полезна она будет))

    Reply
  13. Istur

    (11)Мне кажется в описании все написано. Ну а если другими словами, то обработка, чтобы добавленные программистом реквизиты, колонки, кнопки в типовых конфигурациях выводить программно, дабы при обновлении все это не затерлось, да и просто чтобы процесс обновления был быстрее и менее сложен.

    Reply
  14. woozee

    Да? Есть одна формочка стандартная суперпеределанная…. Надо проверить… Но суть не в этом) Идея (в моем случае) понравилась.

    А привязки по форме в обычной форме тоже программно описывает?:)

    Reply
  15. Istur

    (13) Да, привязки описывает. Это одно из самых важных, как же без них)

    Reply
  16. Yasen

    Спасибо, плюс.

    Ждем когда управляемые формы достигнут подобного уровня программизма )

    Reply
  17. woozee

    Не работает) Минус) В единственной сложной форме и то не пригодился))

    1Ска виснет, нагрузка на комп возрастает до максимума, через продолжительное время вылетает.

    Проблема в 573 строчке (Цикл) — то есть «зацикливание».

    Ждем фикс) Или уже не ждем))

    Reply
  18. Istur

    (16) У меня не возникало подобное.. А какие значения в «СтрИсточник» в зацикливаемой строке? И что за форма?

    Reply
  19. woozee

    Бухгалтерия 2.0.29 СписниеСРасчетногоСчета.ФормаДокумента В СтрИсточник строка дерева =) Они там меняются эти деревья) Значения вроде адекватные, а что так долго — я не знаю. но в замере производительности оно зацикливается.

    Форма Переделана в плане того что добавлена панелька с добавочной страницей, на эту панельку перенесена основная панелька, та самая с кучей страниц. Ну и пара полей добавлено )) Ну как то так)))

    Reply
  20. AlexO

    все делается намного проще.

    копируется форма и меняется все что нужно, подключается паровозом к оснвоной.

    а программно создавать — в любом случае никакие обработки не помогут.

    Вообще, создание программно чего-либо и 1с — вещи несовместимые и чреваты ошибками и лажей.

    Ну не предполагало 1с так делать, не предполагало….

    Reply
  21. woozee

    (19) AlexO,

    Идея программно добавлять нестандартные элементы намного проще чем постоянно отслеживать изменения в элементах формы. Что я и взял на вооружение. Правда перерисовывать то что у нас с этой формой — не представляю даже себе КАК))) Вернее… лениво даже представлять)

    На счет паровозом к основной — Если документ не ахти какой, очень редко обновляется — то да, в какой то степени возможно. Дело в том что в этом случае сложно отслеживать изменения и гораздо чаще будут вылетать ошибки после обновления.

    Самым правильным будет просто переносить свои кнопочки, поля и т.д. Ну и что, что это может занять продолжительное время — зато практически не возникают ошибок)

    Reply
  22. Istur

    (21) +1

    (20)

    Вообще, создание программно чего-либо и 1с — вещи несовместимые и чреваты ошибками и лажей.

    Ну не предполагало 1с так делать, не предполагало….

    Да ты что) А у меня проект, где все добавленные реквизиты выводятся программно, благополучно уже сдан и работает.

    а программно создавать — в любом случае никакие обработки не помогут.

    Ну во-первых цель обработки не сделать вместо программиста, а облегчить, точнее ускорить добавление. Нужно понимание как программно выводить, тогда поможет.

    все делается намного проще.

    копируется форма и меняется все что нужно, подключается паровозом к оснвоной.

    Проще? Неожиданно) Это по сути значит, что форма будет отключена от обновлений, то есть само действие не имеет никакого смысла. Это тоже самое, что при обновлении у формы снимать флажок обновления. И рано или поздно возникнут проблемы, потому что что-либо добавлять нужно обычно в часто используемых объектах метаданных, обновления для которых приходят если не каждый релиз, то через релиз.

    Reply
  23. woozee

    (22) Мне можно надеятся на испралвение ошибки «зацикливания», или забить?:)

    Reply
  24. Istur

    (23) Да, исправлю. Единственное сейчас запар некоторый на работе, но до конца недели точно время найду.

    Reply
  25. o.nikolaev

    Вот все-таки, для чего это может пригодиться? Неужели нельзя обойтись без генерации кучи кода? Что касается форм объектов — ну это понятно — создаются создаются доп. формы журналов (списков) в них отлавливается «ПриВыборе» и открывается «своя» форма объекта. Какая ситуация может потребовать использования такого подхода при доработке типовой конфигурации с возможностью сохранения обновлений?

    Reply
  26. AlexO

    (22) собственно, в (25) вам ответили. Там как один из вариантов подключения допформы.

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

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

    Допформу, кстати, не обязательно пихать в документ, а оставить отдельной обработкой в конфе (и затираться она не будет), а подключать её именно как форму, с сохранением всех остальных событий и процедур родного документа.

    (25) такое может потребоваться как раз там, где нужно и обновления ставить «неглядя», и все-таки внести изменения в «типовую» форму. Т.е. совместить несовместимое.

    Что и удается.

    (22) а все программно выводимые реквизиты… механизм отслеживания изменений — отсутствует (кроме визуального восприятия), механизм проверки и контроля создаваемых программно элементов — отсутствует, набор инструментов для создания таких якобы «программных» элементов (на самом деле — это создание куцых «вроде поля»-элементов, как и все полууправляемые или совсем неуправляемые ЭУ в 1С) — отсутствует.

    В конце концов, будет куча кода, который рухнет под собственной тяжестью.

    «сдал проект».. Сдать — полдела, еще и сопровождать это надо. А от этого, я так понимаю, вы самоустранились.

    Прекрасно понимая, что снова разгребать кучу кода от «программно создаваемых элементов» — занятие не для слабонервных.

    Reply
  27. o.nikolaev

    (26)

    Ну видимо как-то так, да — «совместить несовместимое». И склоняюсь к тому что эту стратегию можно рекомендовать для применения как раз в таком случае — «впихнуть невпихуемое», а в случае когда есть возможность создать доп. формы (обработки с дин. списками и etc.) все же следует создавать объекты, используя префиксы, общие модули и т.п.



    Мнение мое и не обязательно правильное.

    Reply
  28. vkr

    По-моему, предложенный автором метод — прекрасный вариант компромисса для вечно загруженного 1С-программера ! 🙂

    Лично я обязательно начну постепенно использовать — задолбало каждый раз свои «кнопки» перегонять в новый билд…

    Reply
  29. woozee

    Спорить можно бесконечно))

    Всем известно что для решения задачи присутствует разновсяческое множество вариантов. От кривых до идеально правильных, оптимизированных и прям супер-пупер…

    Для проектирования своего нововведения или «хотелок» пользователей нужно учитывать не только легкость обновлений, быстродействие, но и самым важным будет удобство пользователей в работе с энтим инструментом)) При этом учитывать эргономичность формы, и не потерять производительность работы.

    Чем хороша данная обработка — посидел, потыкал кнопки, скопировал код, описал красиво комментариями и забыл до УФ))

    С сопровождением кода проблем не будет никаких. Проблемы возникают только у тех фирм которые сопровождаются у фирм-франчайзи которые имеют штат неопытных сотрудников, либо фирм которые наняли «сопроводителя» «подешевле». Но это другая история))

    Reply
  30. i132

    (26) Идея: для обновлений оставить Основную форму (без визуальных изменений) а добавленные реквизиты хранить на форме _дополнительные — и добавлять при открытии обходом всех элементов этой формы.

    :удобно тем что видно на глаз новые реквизиты и легко изменить их положение.

    Reply
  31. AlexO

    (28) vkr,

    как раз нисколько не прекрсаный, вам предложен более простой и надежный, а главное — сопровождаемый метод.

    Не понимаете — так и скажите.

    (29) woozee,

    >> Чем хороша данная обработка — посидел, потыкал кнопки, скопировал код, описал красиво комментариями и забыл до УФ))

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

    — ну что ж, остается вам пожелать получить срочное задание по доработке/исправлению вот после такого же программиста «а че тут непонятно, если не можешь разобрать программно <мной> созданные формы — ты дурак».

    А 1С специально сделана, чтобы путать всех и вся. И не надейтесь, что вас кто-то пожалеет и будет писать «как вам удобно/известно». 1с-ники — в большинстве народ малограмотный.

    Reply
  32. woozee

    (31) AlexO,

    >> «а че тут непонятно, если не можешь разобрать программно <мной> созданные формы — ты дурак»

    Самое интересное что есть доля правды))) Дело в том что есть некий стандарт разработки, предложения от 1С. Все эти материалы находятся на диске ИТС. Если хотя бы о них догадываться и если еще немного и почитывать, то разбираться в стандартных конфигурациях, и в коде тех программистов которые хотя бы примерно им придерживаются — проблем особых не возникает))

    ……
    //Программист =========
    ДобавитьПрограммноЭлементыФормы();
    //Программист =========
    ……
    
    //Программист =========
    Процедура ДобавитьПрограммноЭлементыФормы()
    
    //Поле ввода и Надпись ФизЛица
    ……
    
    //Поле ввода и Надпись Договора
    ……
    
    КонецПроцедуры
    //Программист =========
    

    Показать

    Чего сложного?:)

    (30) Дело в том что бывает добавлена страница в панельке без отображения заголовков этих страниц. Либо забываешь привязать процедурку к стандартному реквизиту, например, ПриИзменении… ПриВыборе

    Reply
  33. AlexO

    (32) woozee,

    1с сама же и нарушает везде и свюду свои «правила».

    потому у 1с главное правило — никаких правил…

    Reply
  34. vkr

    (31),(33) Вот уж никогда не придерживался «стандартов разработки» от 1С…

    Могу посоветовать Вам прочесть прекрасную книгу :

    Мифический человеко-месяц или Как создаются программные системы

    (The mythical Man-Month: Essays on Software Engineering)

    Автор: Фредерик П. Брукс

    Издание 1975 или 2010 г.

    Надеюсь, она Вам будет полезна…

    Reply
  35. AlexO

    (28) vkr,

    а и не перегоняйте, сделайте, как я советую в (26) ))

    и просто, и обновлять больше не надо.. разве что изменится сама «родная» форма-родитель, и вам захочется сделать «потомка» снова на неё похожим..

    (30) i132,

    что за форма «Дополнительные»? предлагаете создать новую форму, хранить на ней некие новые реквизиты, потом программно считывать их оттуда и вставлять программно же на старую форму?

    а зачем вся эта длиннющая цепочка? а если «порвется» где-нить — как отследите, что перестало работать?

    (34) vkr,

    теория программирования, теории обработки БД, хранения данных, и 1с — несовместимы ))

    это уже известно давно с выходом снежка…

    (0) рано или поздно возникнут проблемы как в (18), т.к всегда «остаются куски причудливой формы», все эти программные изыски неуниверсальны в силу уже указанной причины — ребята, это не Си, а 1С, которая плевать хотела на все правила, стандарты и развитие программирования, а с выходом 8.2 — и вообще плевать на программиста..

    Reply
  36. AlexO

    хотя у меня есть идея, где все это «программное» чудо пригодится… как раз для «чистого» творчества нужно…

    только боюсь, даже в условиях ограниченных требованиях, которые я предъявлю, программное формирование элементов от 1С не выйдет из своих жестких рамок..

    А декомпилировать всю форму со всеми элементами из=за обновлений, чтобы добавить один-два новых элементов на форму..

    А почему никто не попробовал сделать как предложено в (30) — добавлять только нужные, и привязками/размещением играть?

    хотя сами элементы могут сместится на новой форме…. а это уже никак не отследишь программно — или писать целый механизм сравнений и корректировок..

    короче, я вам способ подсказал, но можете все делать программно ))

    а я попробую в том механизме, где это действительно нужно и очень важно…

    Reply
  37. AlexO

    слушай, Истур, а это ведь ты натолкнул меня на мысль со своей идеей дискретно декомпилировать.. хотя и так вроде было на поверхности, а вот поди ж ты… ))

    надоть тебе плюсик за это поставить…

    Так проблема из (18) поправлена?

    если можно, пришли исправленный вариант по личке… а то тут с этими ограничениями замучаешься качать…

    Reply
  38. vkr

    (35) Да, я с Вами согласен по поводу идеологической несовместимости 1С с нормальными принципами…

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

    Спасибо за диалог! 🙂

    Reply
  39. woozee

    (37) AlexO, странно, муза под конец рабочего дня приходит =)

    Reply
  40. AlexO

    (38) vkr,

    с 1с бороться бесоплезно ))

    примените стиль айкидо — уйти с линии удара и пусть валится…а как упадет — можно диктовать свои условия.. ))

    (39) woozee,

    что-то путное на 1с можно изобрести только абстрагировавшись от 1с ))

    Reply
  41. echo77

    При добавлении колонки в ТабличноеПоле метод УстановитьДействие не прокатывает :-/

    Было бы неплохо накидать справку в обработке, подобную той что вы здесь привели

    Reply
  42. vkr

    (40) Спасибо, Вы очень точно сформулировали методику взаимоотношений с 1С… 🙂

    Буду теперь знать, как это называется…

    Только на диктовку им условий мне начхать — я работаю по-своему, клиенты довольны — это главное…

    Reply
  43. Sverkalov
  44. AlexO

    (44) что-то сомнительно… в тонком же это невозможно в принципе — так откуда «для управляемых форм»??

    Reply
  45. vasiliy_b

    (45) Почему же невозможно? Программно добавлять элементы на форму можно?! Обходить все элементы формы можно?! так почему же это нереально?

    Reply
  46. AlexO

    (46) в УП нельзя. УФ формируются динамически, поэтому программно ничего добавить нельзя.

    Только если в режиме толстого клиента.

    Reply
  47. vasiliy_b

    (47) AlexO, А как же тогда реализован вывод реквизитов свойств объектов на формы? В типовых конфигурациях в управляемых формах? Прежде чем говорить посмотрите сначала УТ 11 например, в справочник номенклатур добавьте пару свойств…. и о чудо дядьки из 1с прибегут и добавят вам эти реквизиты к объекту, чтоб они динамически сформировались…. а потом еще будут прибегать когда вы будете обновления накатывать.

    Reply
  48. Yasen

    (47) AlexO,

    программно ничего добавить нельзя

    Откуда такие сведения если не секрет? Религия не позволяет или Нуралиев запретил?

    Reply
  49. vasiliy_b

    Ошибка: Берем ТЧ документа, добавляем новый реквизит(я добавлял типа число (15,3)) далее выводим эту колонку на форму привязываем событие «ПриИзменении», и добавляем изменение цвета при выводе строки.

    Декомпилируем эту колонку и получаем следующие ошибки:

    Было:

    Колонка.УстановитьДействие(«ПриИзменении»,Новый Действие(«Товары_БруттоПриИзменении»));

    Надо

    Колонка.ЭлементУправления.УстановитьДействие(«ПриИзменении»,Новый Действие(«Товары_БруттоПриИзменении»));

    Было

    Колонка.ЭлементУправления.ТипЗначения = Новый ОписаниеТипов(«Число»,,,Новый КвалификаторыЧисла(15,3));

    Это не нужно, ругается т.к. тип уже назначен. И еще нужно добавить:

    Колонка.Имя = «_Брутто»

    Иначе имя колонки добавляет «Колонка1»

    Reply
  50. AlexO

    (48) да, ошибся, извините.

    Думал, только невизуальные реквизиты можно.

    Посмотрел, добавлять можно, но что-то все через ж.. происходит с результатом..

    Reply
  51. amiralnar

    Отличная обработка, спасибо! Пол года о ней мечтал. Ну теперь — держись, УПП =)

    Reply
  52. amiralnar

    Есть проблема:

    Для декомпиляции выбираю форму реализации товаров и услуг.

    При работе через терминал (возможно это важно) подвисает на процедуре ДеревоЭлементовФормыПриПолученииДанных(Элемент, ОформленияСтрок)

    За 5 секунд успевает выполнить эту процедуру 85 000 раз.

    Пока отключаю процедуру и ориентируюсь по пустым строкам.

    Можно ли при построении дерева сразу указать представление ячеек?

    Reply
  53. bambr1975
    Reply
  54. kiruha

    Возможно ли от программно созданной формы перейти к непрограммно ?

    Шаг обратный декомпиляции, чтобы клиенту высылать стандартную, нединамическую ?

    Reply
  55. AlexO

    (55) kiruha,

    нет, невозможно — механизма превращения кода 1с в «физический» объект с записью в конфигурацию (на диск) не существует.

    Впрочем, в 1с8 в принципе нет выгрузки объектов интерфейса отдельно.

    Даже просто создания махонького реквизита для хранения данных у объекта.

    Это привет вам от Великого Отсутствия ООП в 1с ))

    Если же вы про превращение УФ в обычную форму — тоже невозможно автоматически.

    Reply
  56. AlexO

    (22)

    Да ты что) А у меня проект, где все добавленные реквизиты выводятся программно, благополучно уже сдан и работает.

    ну, и как обновляете модуль формы со всеми процедурами обработки таким образом созданных элементов?

    Reply
  57. AlexO

    (8) mamanelli,

    ведь нормальный кодер должен знать это «на кончиках пальцев»

    ждем статью, где все, что надо будет знать программисту «на кончиках пальцев», будет описано и выложено в коде, набранном именно таким же методом — без справки по памяти ))

    Reply
  58. rasswet

    при попытке разобрать форму (устанавливаем курсор на форму элемента в дереве слева) в ЗУП релиз 47 (командировки организаций) падает сеанс 1С:Предприятие 8.2 (8.2.15.301)

    Reply
  59. AlexO

    (48) vasiliy_b,

    в справочник номенклатур добавьте пару свойств…. и о чудо дядьки из 1с прибегут и добавят вам эти реквизиты к объекту, чтоб они динамически сформировались….

    ну и где же динамически добавленные «реквизиты»? уж не хранятся ли они в строго ограниченных регистрах свойств объектов?

    вы или ваши дядьки из 1с сделате так, чтобы «программно созданный» реквизит хранил данные, а не просто использовался для подстановки предопределенных значений??

    Reply
  60. AlexO

    (59) rasswet,

    это нормально

    Reply
  61. AlexO

    В УПП в справочнике Проекты при выборе ФормыЭлемента — вылет.

    Reply
  62. rasswet

    (61) ну..не совсем..другой парсер с этого сайта парсит без ошибки.

    но мне нравится работать с тем, который тут. а он валится.

    Reply
  63. bambr1975

    (63) rasswet, попробуйте слегка поправить код (как описано в (54)) — может, поможет 😉

    Reply
  64. AlexO
    Reply
  65. rasswet

    (65) спасибо, завтра протестирую на той же форме.

    Reply
  66. rasswet

    (65) протестировал ваш файл.

    теперь не виснет. но есть Ошибка

    {ВнешняяОбработка.ДекомпиляцияИАнализФорм.МодульОбъекта(165)}: Поле объекта не обнаружено (Верх)

    мТекст.ДобавитьСтроку(Таб + СтрокаПробелов + «УстановитьПоложениеЭлемента(» + ТекстЭлементДляРазмеров + «,» +

    Reply
  67. rasswet

    (65) уточню. ошибку выводит когда ставлю Флаг напротив «работники организации» табличное поле. и при полном анализе формы. на других элементах ошибку не выдает.

    Reply
  68. AlexO

    (67) rasswet,

    я не знаю, что у вас за конфигурация, и что за объект «Работники организаций», в котором есть некое ТабличноеПоле.

    Поэтому здесь не помогу ничем.

    По поводу

    Поле объекта не обнаружено (Верх)

    — у распарсиваемого объекта нет свойства «Вверх», которое ищет обработка и пытается изменить.

    Reply
  69. rasswet

    (69) зуп конфигурация. немного измененная..

    Reply
  70. AlexO

    (68) rasswet,

    когда ставлю Флаг напротив «работники организации» табличное поле. и при полном анализе формы

    если эти «Работники организаций» — это регистр сведений, то в типовой ЗУП ошибок нет.

    Reply
  71. dandrontiy

    Идея интересная. А вот бы обработку, которая из <неуправляемой> формы создавала <управляемую>

    Reply
  72. rasswet

    (71)это документ «командировки организаций», табличная часть его называется «работники организации»

    Reply
  73. AlexO

    (72) dandrontiy,

    1c в принципе «не предусмотрела» таких конвертаций и механизмов для этого не вводила в платформу.

    Reply
  74. AlexO

    (73) rasswet,

    ругается на поля ТП.

    Поля «ОсвобождатьСтавку» и «НапомнитьПоЗавершении» — имеют тип булево (флажки), и, видимо, с этим и связано «непонимание» обработки. Остальные поля с дургими типами — отрабатывают.

    Reply
  75. dandrontiy

    (74) AlexO, Так я про это и говорю.

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

    Reply
  76. AlexO

    (76) dandrontiy,

    это вы про чисто механическую обработку визуальных элементов, которые и в 8.1, и в 8.2 — основаны у 1с на одних и тех же сишных бибилиотеках.

    А с кодом-то что будете делать? или у вас форма будет работать и функционировать без кода формы? 🙂

    Reply
  77. mtv:)

    (0) Наткнулся на ограничения программной генерации элементов формы:

    1. В ФормеДокумента у ПоляВвода невозможно программно задать «Связь по владельцу».

    2. В ФормеСписка при программной вставке Колонки в ТабличноеПоле, в диалоге «Отбор и сортировка» отсутствует втавленная Колонка.

    Пока только это, возможно есть и другие ограничения.

    Reply
  78. sorb

    Отличная обработка, нередко ей пользуюсь.

    На днях столкнулся с такой проблемой: при попытке анализа формы обработки «ПанельФункций» из БП 2.0 словил ошибку:

    {ВнешняяОбработка.ДекомпиляцияИАнализФорм.МодульОбъекта(490)}: Поле объекта не обнаружено (Имя)
    Если пФормаКопия.ЭлементыФормы.Найти(Стр1Уровня.Элемент.Имя)=Неопределено Тогда
    

    В отладчике видно следующее:

    Стр1Уровня.Элемент = Панель (Тип Панель)

    Стр1Уровня.Элемент.Имя = «Поле объекта не обнаружено (Имя)»

    Стр1Уровня.ИмяЭлемента = «ПанельПериод»

    Теперь вопросы 🙂 :

    1. Кто-нибудь пробовал анализировать данную конкретную форму? Если да, то возникала ли такая ошибка?

    2. Из кода видно, что вложенность панелей не учитывается. Правильно ли я понимаю, что это и послужило причиной ошибки?

    P.S. Шибко ковыряться сейчас нет времени, поэтому буду благодарен за любую помощь.

    Reply
  79. AlexO

    Вот и пришло время начать говорить о том, что НЕЛЬЗЯ сделать программно.

    Нельзя создавать стандартные кнопки — Добавить, Переместить, Сортировать и т.д.

    Потому как нужно задавать действие, а его как такового не существует — пока не создана панель с кнопками. Т.е. в платформу не вшиты события стандартных кнопок, на которые можно было бы сослаться — они генерируются при создании элемента. Создаешь панель — создаются кнопки и события. Либо можно сослаться на уже созданные кнопки, но только если они есть. АвтоЗаполнение компанели, кстати, тоже не работает при программном создании.

    Это ответ 1с — ООПу и наследованию классов.

    И даже программное создание своих кнопок — требует, чтобы события обработки действий находились в модуле формы, иное не работает ни при каких обстоятельствах (ссылки на форму/другие формы — бесполезны).

    В 8.2 на УФ данную проблему можно обойти (создавать стандартные кнопки в своих панелях), но там свои проблемы — с размещением кнопок и далеко не в каждой пользовательской панели их можно разместить.

    Reply
  80. AlexO

    Далее. Нельзя программно переместить элемент с одной вкладки на другую.

    Все интереснее и чудесатее..

    Reply
  81. AlexO

    (28) vkr, (29) woozee,

    вот и прошел мой пример испытание временем ))

    Попробуйте программно создать вкладку, ТП на ней, компанель к ней…. на последнем пункте все и рушится.

    Нельзя создать такую панель.

    А работает единственный мой способ с подменой формы.

    Так что программное создание элементов, мягко говоря, оченьо узкое и специализированное занятие.

    (22)

    Да ты что) А у меня проект, где все добавленные реквизиты выводятся программно, благополучно уже сдан и работает.

    значит, ничего серьезного не делали программно ))

    Вот даже элементарную стандартную панель нельзя сделать ))

    Upd:

    Ниже разобрались, что можно сделать создание КП через общий модуль (но не глобальный), заработало автозаполнение (почему не работало — причина осталась неясна), и без хранения исходной КП с кнопками на родительской форме.

    Reply
  82. bambr1975

    (82) AlexO, честно говоря, Вы производите впечатление человека неглупого, но какого-то ни во что не верящего и ужасно невнимательного.

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

    P.S. Ограничения в программном добавлении элементов на форму безусловно есть — но и ручную обработку поступающей информации тоже никто не отменял — просто можно же себе жизнь упростить…

    Reply
  83. AlexO

    (83) именно это и пробовал — и в модуле формы, и в общем модуле:

         КоманднаяПанель = ЭлементыФормы.КоманднаяПанель2;
    КоманднаяПанель.ИсточникДействий = ЭлементыФормы.ТабличноеПоле1;
    КоманднаяПанель.Автозаполнение=Истина;

    — не работает…

    Сейчас вообще ругается — «Перменная не определена: ГраницаЭлементаУправления».

    В общем, веселая у меня база…

    Reply
  84. bambr1975

    (84) AlexO, источник действий — существующий реквизит формы (он у Вас существует? Проверьте!)

    ГраницаЭлементаУправления — системное перечисление. Доступно в толстом клиенте. Вы в толстом клиенте работаете?

    Короче — разобраться можно… Если понимать, зачем Вам это…

    Reply
  85. AlexO

    (85) bambr1975,

    источник действий — существующий реквизит формы

    мы же его (ТабличноеПоле) полностью программно создаем? или все-таки должно быть уже в реквизитах формы — реквизит табличное поле?

    . Доступно в толстом клиенте

    я знаю, что это системное перечисление. Как и «ТипКнопкиКоманднойПанели».

    Все работало, а потом — раз, и «не видит» перечислений…

    Работаю конечно в толстом. Все уже проверил (сама думал — вдруг слетело).

    Reply
  86. AlexO

    (83) bambr1975,

    вот, кстати, мой идентичный неработающий код:

     КоманднаяПанель = ЭлементыФормы.Добавить(Тип(«КоманднаяПанель»),»кпПроект»,Истина,ЭлементыФормы.Панель1);
    УстановитьПоложениеЭлемента(КоманднаяПанель,10,25,6,380);
    КоманднаяПанель.ИсточникДействий = ЭлементыФормы.тпМенеджеры;
    КоманднаяПанель.УстановитьПривязку(ГраницаЭлементаУправления.Низ,КоманднаяПанель,ГраницаЭлементаУправления.Верх);
    КоманднаяПанель.УстановитьПривязку(ГраницаЭлементаУправления.Право,ЭтаФорма.Панель,ГраницаЭлементаУправления.Право);
    КоманднаяПанель.АвтоЗаполнение = Истина;
    

    тпМенеджеры — до этого программно созданное ТП.

    Reply
  87. bambr1975

    Реквизиты формы должны находиться на закладке «Реквизиты» у формы. Их программно создавать у нас не получится (в этом и есть ограничение. А вот ЭЛЕМЕНТЫ ФОРМЫ, связать с реквизитами и назначить им свойства — пожалуйста.

    Reply
  88. AlexO

    Ненадежно оно как-то все. Автозаполнение сразу не заработало, перечисления — перестал видеть немного погодя.

    Системные кнопки тоже не видит. Вернее, их действия.

    Reply
  89. bambr1975

    В Вашем неработающем коде, скорее всего для тпМенеджеры не установлено

    ЭлементыФормы.тпМенеджеры.Данные=»<строка реквизита формы, значение которого у вас должно выводиться в это тп>;

    Этот реквизит должен быть или табличной частью объекта, форму которого Вы разрабатываете или этот реквизит должен быть описан на закладке «Реквизиты» самой формы.

    Reply
  90. bambr1975
    Системные кнопки тоже не видит. Вернее, их действия

    Ну… это смотря как эти действия задавать. У меня видит.

    Reply
  91. AlexO

    (90) bambr1975,

    да ну как не установлено — установлено конечно же 🙂

    ТабличноеПоле = ЭлементыФормы.Добавить(Тип(«ТабличноеПоле»),»тпМенеджеры»,Истина,ЭлементыФормы.Панель1);
    УстановитьПоложениеЭлемента(ТабличноеПоле,40,173,6,380);
    ТабличноеПоле.Данные = «МенеджерыПроектов»;
    

    где МенеджерыПроектов — ТЧ объекта

    Reply
  92. AlexO

    (91) bambr1975,

    ну например, вот так:

    кпПроектКнопки.Вставить(1,»Скопировать»,ТипКнопкиКоманднойПанели.Действие,»&Скопировать»,Новый Действие(«Скопировать»));

    хотел системную кнопку «Скопировать» заарканить.

    Reply
  93. bambr1975

    (78) mtv:),

    1. В ФормеДокумента у ПоляВвода невозможно программно задать «Связь по владельцу».

    2. В ФормеСписка при программной вставке Колонки в ТабличноеПоле, в диалоге «Отбор и сортировка» отсутствует втавленная Колонка.

    Первая проблема вроде действительно не рещается.

    Вторая — решается простым добавлением в код программного добавления строк:

    ЭлементыФормы.ТабличноеПоле.НастройкаОтбора.РеквизитДобавленнойКолонки.Доступность=истина

    Reply
  94. Feelthis

    Если сделать как написано в комментарии:(54) то все прекрасно работает, а так при анализе документа «Начисление по больничному листу» зацикливался в процедуре «ПеренестиПодчиненныеСтроки» модуля объекта и 1С в дамп вываливалась

    Reply
  95. frc

    (78) mtv:),

    В ФормеДокумента у ПоляВвода невозможно программно задать «Связь по владельцу».

    это ограничение еще с 8.0 — запрещено программно устанавливать СвязьПоВладельцу.

    2. В ФормеСписка при программной вставке Колонки в ТабличноеПоле, в диалоге «Отбор и сортировка» отсутствует втавленная Колонка.

    По Сортировке нужно отдельно прописать установку флага

    ЭлементыФормы.ДокументСписок.НастройкаПорядка[«ИмяКолонкиТП»].Доступность = Истина;

    (111) bambr1975,

    ЭлементыФормы.ТабличноеПоле.НастройкаОтбора.РеквизитДобавленнойКолонки.Доступность=истина

    в Отбор вроде как попадает без этой строки сразу при создании.

    Reply
  96. tchvlad

    (8) mamanelli,

    Уважаемый не полно оценил 🙂

    Какие еще кончики пальцев? Тупо кодить массу текста, когда можно автоматизировать?

    Я использую аналоги этой разработки — мои кончики пальцев и так не знают отдыха, многое умеют, а потому жирный плюс.

    Reply
  97. Cerberdm

    (54) bambr1975, Спасибо, помогло.

    Reply
  98. Cerberdm

    Автору огромная благодарность ) начал уже создавать свою обработку для этих же целей, хорошо вовремя на ссылку наткнулся, не так много времени убил. Плюсую без вопросов! Отличная работа) — особенно с учетом (54)

    Reply
  99. wing

    Обработка не добавляет страницы на панели… а в остальном очень удобна с правками (54)

    Reply

Leave a Comment

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