Метаданные ++ (для 1С 8.2 обычное приложение)




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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='\

89 Comments

  1. tango

    нормальный ход

    Reply
  2. Altair777

    Первый, кто найдет ошибку, получит вознаграждение в 5 с/м 😉

    Reply
  3. Ёпрст

    Не пригодится

    как то снегопатом обхожусь пока.

    Ну разве что сравнение объектов можно поглядеть

    Reply
  4. Altair777

    (3) Ёпрст, сравнение объектов — это круто 🙂

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

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

    Он их визуально сравнивал, но это свойство доступно только по правой кнопке.

    Reply
  5. dusha0020

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

    Reply
  6. Altair777

    (5) dusha0020, спасибо, Андрей

    Кстати, тебя тоже с днюхой! Всего-всего тебе и побольше 🙂

    Reply
  7. yuraos

    (2)

    Задумка отличная, но чего то не хватает в интерфейсе



    Ах да!

    В конфигураторе все как-то в виде дерева представлено!

    Reply
  8. echo77

    Да, вид в виде дерева — более привычнее.

    А можно настроить размер картинок в отчете по общим картинкам? (Чтобы больше картинок умещалось на экране)

    Reply
  9. DoctorRoza

    Вещь из разряда «must have для программиста». Когда все-таки приходится писать запросы в конфигураторе и нужно посмотреть значения перечислений и др. предопределенных элементов, то норм. Соглашусь с мнениями коллег, нужно отображение в виде дерева, как в левой таблице так и в правой. Добавить также вариант для управляемого интерфейса. Для программиста поле представление объекта нужно отчасти, в основном Имя, так что какой-нибудь флажок или настройка отображения. Добавить поиск объекта метаданных/реквизита по представлению, нужная штука, для УПП однозначно или в конфе 1С-Совместимо. По нажатию кнопки открыть страничку разработки открывается страница Метаданные+, а не актуальная. А в целом, постоянно такая обработка нужна.

    Reply
  10. vladir

    Отличная обработка. Правда посмотреть как работает не могу, попытка скачать ограничилась лишь снятием $m и записью что файл скачан, сам файл получить не удалось…

    Reply
  11. Altair777

    (7) yuraos,

    В конфигураторе все как-то в виде дерева представлено!

    Речь идет о левой табличной части? Тут есть плюс и минус — дерево привычнее, но ТЧ, имхо, удобнее.

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

    Спасибо за предложение.

    Reply
  12. DrZombi

    Для обычного приложения не интресно 🙁

    Автор, лучше давай для Управляемого 🙂

    И лучше не на форуме 🙂

    Reply
  13. Altair777

    (8) echo77, приму к сведению.

    Но не через размер, а через количество колонок. Так будет нормально?

    Reply
  14. DrZombi

    Посмотрел, ну… да, работа проделана, но лючше бы ты такое реализовал на управляемом приложении 🙂

    Цены бы тогда не было бы 😉

    Reply
  15. Altair777

    (10) vladir, попробуйте еще раз.

    За повторное скачивания одного и того же файла в течение одного дня с/м не должно сниматься.

    Если что — пишите в личку

    Reply
  16. Altair777

    (9) DoctorRoza, спасибо за такой обстоятельный комментарий.

    Но пока что успел только поменять ссылку на страничку разработки 🙂

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

    А управляемые формы… У нас на них только «Документооборот», как вспомню так и вздрогну

    Так что, это дело не ближайшего будующего.

    Reply
  17. Altair777

    (14) DrZombi, если сделаю на УП, то цену я определю 😉

    Reply
  18. vladir

    (15) спасибо. Со второго раз действительно получилось скачать. Буду сегодня посмотреть :)))

    Reply
  19. Altair777

    (18) vladir, не за что 🙂

    Надеюсь, повторно с/м не сняли

    Reply
  20. vladir

    (19) на этот раз не сняли. А вот месяца полтора назад была такая же ситуация, потратил на эксперименты по скачиванию 4 или 5 с/м. Мелочь, конечно, но напрягло 🙁 Обработка, ВЕСЧЬ! Бывает надо посмотреть, что есть что в реквизитах объекта.

    Reply
  21. Altair777

    (8) echo77, обновил с выбором количества колонок при печати всех картинок

    Reply
  22. Altair777

    (20) vladir,

    > Бывает надо посмотреть, что есть что в реквизитах объекта

    Вот именно! 🙂

    Вот пример:

    КонтрагентДляОтбора = ДопМодуль.ВернутьКонтрагентаПоИНН(«», КодПоЕДРПОУДляПоиска);

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

    А встроенные подсказки и Снегопаты об этом знают? Смогут ли они дать контекстную подсказку по реквизитам?

    Reply
  23. yuraos

    (19)

    у меня подобная фигня на работе через IE наблюдается.

    У него что-то нарулено с безопасностью.

    После теста на «интеллект» IE блокирует загрузку файла.

    Говоришь ему — да, мол хочу загрузить.

    IE после этого торгуется малость и снова показывает

    страничку с тестом «интеллекта» без загрузки файла.

    Reply
  24. yuraos

    (23)

    ЗЫ

    Самое интересное, что прихожу домой

    и через Operu скачиваю файл,

    который на работе неудалось скачать через IE

    и при этом s-мани повторно не снимаются

    (снимаются 1 раз на работе при первой попытке).

    Reply
  25. echo77

    (2) Нашел!

    {Обработка.Метаданные2Плюс.Форма.Форма.Форма(504,35)}: Переменная не определена (ОбщегоНазначения)

    ВремТабл.Колонки.Добавить(«Имя», <<?>>ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));

    Не работает ни черта в моей самописной конфигурации

    🙂

    Создал такую же экспортную процедуру в модуле обработки. Пока все пашет

    Reply
  26. Altair777

    (25) echo77,

    Да-с, не заметил-с…

    Те, кто уже скачал:

    1) в модуле формы замените строку 504

    ВремТабл.Колонки.Добавить(«Имя», ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));

    на

    ВремТабл.Колонки.Добавить(«Имя», ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));



    2) в модуле обработки добавьте код:

    Функция ПолучитьОписаниеТиповСтроки(ДлинаСтроки) Экспорт

    Возврат Новый
    ОписаниеТипов(«Строка», , Новый КвалификаторыСтроки(ДлинаСтроки, ДопустимаяДлина.Переменная));

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

    Reply
  27. Altair777

    (25) echo77,

    Обновил файл, 5 с/м перевел 😉

    Reply
  28. help1Ckr

    (3) Ёпрст, Да. снегопат делает ненужными многие обработки. Это мегавесч. Но за неимением оного очень даже хорошая обработка

    Reply
  29. AlexO

    Ну вот это уже более понятно.

    (17)

    если сделаю на УП

    Зачем оно нужно? 🙂

    Reply
  30. AlexO

    (9) DoctorRoza,

    Вещь из разряда «must have для программиста».

    У вас весь ИС — «must have» 🙂

    Reply
  31. AlexO

    (22)

    Вот пример:

    КонтрагентДляОтбора = ДопМодуль.ВернутьКонтрагентаПоИНН(«», КодПоЕДРПОУДляПоиска);

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

    А что, обработка скажет, в данную вариативную переменную возвратится именно ссылка на Контрагента? Она что — оценит функцию ВернутьКонтрагентаПоИНН на предмет типа возврата?

    Reply
  32. Altair777

    (29) AlexO, я вот сейчас попробовал запустить В Документообороте (на УП) — фигня получается:)

    Reply
  33. Altair777

    (30) AlexO,

    У вас весь ИС — «must have» 🙂

    кроме Вашей разработки? 😉

    Reply
  34. Altair777

    (31) AlexO, читайте внимательно последнюю строку из приведенной Вами цитаты…

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

    Читайте и думайте.

    Reply
  35. SeiOkami

    А у меня такая ошибка при открытии:


    {ВнешняяОбработка.Метаданные2Плюс.МодульОбъекта(1724,9)}: Процедура или функция с указанным именем уже определена (ПолучитьОписаниеТиповСтроки)

    Функция <<?>>ПолучитьОписаниеТиповСтроки(ДлинаСтроки) Экспорт

    Конфа сложная самописная)

    Reply
  36. Altair777

    (35) SeiOkami, это просто несчастный случай 🙂

    Как я понимаю, такая функция уже есть в общем глобальном модуле?

    Попробуйте удалить эту функцию из модуля обработки.

    Сейчас переименовал все экспортные процедуры и функции и обновил файл обработки.

    Можете еще раз скачать — за повторное скачивание в течение дня денег не снимает.

    Reply
  37. AlexO

    (34)

    Читайте и думайте.

    «Разработчик — знает»

    «Читайте и думайте»

    «Обработка — ?»

    Достройте, пожалуйста, логическую цепочку 🙂

    Reply
  38. Altair777

    (37) AlexO,

    Разработчик знает

    Разработчик открывает МД++

    Разработчик находит Справочники — Контрагенты

    Разработчик видит реквизиты

    Разработчик копипастит идентификаторы в свой код

    Reply
  39. AlexO

    (38)

    Разработчик находит Справочники — Контрагенты

    Разработчик видит реквизиты

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

    Обработка делает анализ функции?

    Reply
  40. Altair777

    (39) AlexO,

    Обработка не делает анализ функции.

    Анализ функции делает программист. Или уже не делает, если знает.

    И программист находит с помощью обработки реквизиты нужного объекта.

    Неужели до сих пор непонятно?

    Reply
  41. AlexO

    (40)

    И программист находит с помощью обработки реквизиты нужного объекта.

    Странный программист.. сертифицированный 1С, небось? 🙂

    А если там объект получают «через 31 функцию», или просто его же там и создают? Или запросом?

    Reply
  42. Altair777

    (41) AlexO, я так понимаю что сейчас уже пошел чистый флуд и жажда наживы?

    Любой нормальный программист получает результат функции осознанно, а не просто так.

    И он знает что она вернет.

    Reply
  43. AlexO

    (42)

    И он знает что она вернет.

    Так зачем тогда обработка, если и так наперед известно, что она вернет? 🙂

    Мы с чего начали?

    «А что, обработка скажет, в данную вариативную переменную возвратится именно ссылка на Контрагента?»

    А пришли — к

    Любой нормальный программист получает результат функции осознанно, а не просто так.

    И он знает что она вернет.

    Змей укусил себя за хвост. А где же обработка? 🙂

    Reply
  44. Altair777

    (43) AlexO, обработка позволяет показать реквизиты возвращаемого объекта.

    Reply
  45. AlexO

    (44)

    обработка позволяет показать реквизиты возвращаемого объекта.

    А как она видит этот возвращаемый объект, если запущена только обработка? Вы научились перехватывать процессы 1С?

    Reply
  46. Altair777

    (45) AlexO,

    еще раз прочитайте (38)

    P.S. Большая просьба — для Ваших словесных упражнений найдите другую публикацию.

    Reply
  47. AlexO

    (46)

    Большая просьба —

    Такая же большая просьба — четко отвечать 🙂

    Ведь если обработка ничего такого не видит, а возвращаемое значение должен «знать» программист, который по отладке получает возвращаемое значение и потом смотрит — «а какие же это реквизиты у этого типа?», так что мешает ему их посмотреть в дереве метаданных?

    Вот этот тонкий момент как-то все время обходится стороной 🙂

    Reply
  48. Altair777

    (47) AlexO,

    > так что мешает ему их посмотреть в дереве метаданных?

    Ничто не мешает. Кроме того, что для этого нужен конфигуратор.

    Reply
  49. AlexO

    (48)

    Кроме того, что для этого нужен конфигуратор.

    А как иначе тогда узнаешь тип возвращаемого значения, если:

    — не помнишь/не знал

    — конфигуратора нет

    — данная обработка этого не делает

    ?

    Reply
  50. Altair777

    (49) AlexO,

    Прочитайте (22)

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

    А встроенные подсказки и Снегопаты об этом знают? Смогут ли они дать контекстную подсказку по реквизитам?

    После этого Вы начали безосновательный флуд в комментариях.

    Reply
  51. AlexO

    (50)

    А встроенные подсказки и Снегопаты об этом знают? Смогут ли они дать контекстную подсказку по реквизитам?

    Это вот был вопрос к Снегопату с подсказкой, или реплика в защиту обработки?

    Но за сравнение объектов спасибо, это можно глянуть 🙂

    Reply
  52. Altair777

    (51) AlexO, это было напоминание — с чего Вы начали флуд

    Reply
  53. Altair777

    Новая версия с деревом объектов почти готова. Не хватает только картинки с коллекцией иконок объектов.

    Вот, что у меня есть:

    Может, кто поделится? Или подскажет, где скачать готовую.

    Reply
  54. Al-X

    Хорошая вещь !!! Именно посмотреть реквизиты не заходя в конфу — мне и не хватало !!!

    Спасибо !

    Reply
  55. DMSDeveloper

    Ай спасибо, мил человек!

    Как вовремя мне попалось твое творение. Нет нужды теперь самому мастырить подобное.

    Reply
  56. Abadonna

    (0) А слабо еще вот это добавить? 😉

    Reply
  57. Altair777

    (55) DMSDeveloper,

    очень рад!

    Reply
  58. Altair777

    (56) Abadonna,

    Ага! А потом ты еще имена полей попросишь? 🙂

    Reply
  59. Altair777

    (54) Al-X, для этого и писалось 🙂

    Reply
  60. Abadonna

    (57)

    А потом ты еще имена полей попросишь? 🙂

    Я-то ничего не попрошу. Чужой кокаин не нюхаю, свой есть — качественный, безглючный, на модули «ОбщегоНазначения» не ссылается :)))

    Reply
  61. Abadonna

    (57) а если серьезно, то для SQL-баз имена таблиц очень даже не лишние!

    К примеру, DELETE FROM … а from=???, надо знать!

    Reply
  62. tango

    (6) фига се мониторчики

    Reply
  63. Altair777

    (60) Abadonna,

    А тоже кокаин не нюхаю. А как насчет водочки? 😉

    А по сабжу — уже готова версия с деревом объектов. Но… см (53)

    В нее и вставлю.

    Reply
  64. Altair777

    (62) tango,

    ага! 🙂 У меня 2 SyncMaster S23B300

    Reply
  65. Famza

    Зачет, однозначно

    Reply
  66. Altair777

    (65) Famza,

    Спасибо большое!

    Все никак не закончу новую версию — не насобираk картинок для дерева.

    Напишите в личку e-mail — вышлю свежую версию, потестируете 🙂

    Reply
  67. Famza

    (66) спасибо, получил.

    Но тут возникло 2 момента, так сказать.

    Момент 1 — наугад открывал Обработки.АвтоОбменДанными в ЗУП 2.5.70.1:

    Ошибка открытия объекта.

    {ВнешняяОбработка.Метаданные2Плюс.МодульОбъекта(292)}: Ошибка при вызове метода контекста (ПолучитьФорму): Недопустимое значение параметра (параметр номер ‘1’).

    Может какую проверку добавить, чтоб ошибки не вываливало?

    Момент 2 — просьба:

    Можно Нужно ли добавить в условие отбора ссылку на элемент?

    Reply
  68. Altair777

    (67) Famza,

    п.1 — Специально не делал такую проверку, чтобы было нагляднее в чем проблемы

    п.2 — сорри, не очень понял о чем речь?

    Если речь идет об объектах/полях — то все отборы в вашей власти 🙂

    Reply
  69. Altair777

    (67) Famza,

    + 68

    Reply
  70. Famza

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

    Reply
  71. Altair777

    (70) Famza,

    Данная обработка предназначена для показа структуры базы данных, а открытие форм — это дополнительная фича.

    Я не могу придумать логической связи между метаданными справочника «Сотрудники» и конкретным элементом «Петров».

    Если уж Вам хочется держать Петрова всегда под рукой 🙂 …. Каталог внутренних и внешних объектов (для 1С8)

    Reply
  72. Famza

    (71) спасибо. Это была просто хотелка — добавить поле дополнительного отбора. А про обработку я писал (65)

    Reply
  73. 7OH

    Хотелось бы видеть в представление реквизита полное имя.

    Например: «Документ.РКО» или «Перечисление.ВидыОпераций», а не просто «РКО» или «ВидыОпераций».

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

    Сделаете ?

    Reply
  74. 7OH

    Мой вариант доработки

    Функция Алт_ВернутьТипРеквизита(Реквизит) Экспорт
    // типов может быть несколько и надо определить каждый
    Вернуть = Новый СписокЗначений;
    Для каждого РеквизитТип Из Реквизит.Тип.Типы() Цикл
    ТипРеквизитаМД = РеквизитТип;//Реквизит.Тип;
    Попытка
    Если Тип(ТипРеквизитаМД) = ТипСтрока Тогда
    Тип = Строка(ТипРеквизитаМД) + » (» + ТипРеквизитаМД.КвалификаторыСтроки.Длина + «) [» + ТипРеквизитаМД.КвалификаторыСтроки.ДопустимаяДлина + «]»;
    ИначеЕсли Тип(ТипРеквизитаМД) = ТипЧисло Тогда
    Тип = Строка(ТипРеквизитаМД) + » (» + ТипРеквизитаМД.КвалификаторыЧисла.Разрядность + «.» + ТипРеквизитаМД.КвалификаторыЧисла.РазрядностьДробнойЧасти
    + «) [» + ТипРеквизитаМД.КвалификаторыЧисла.ДопустимыйЗнак + «]»;
    ИначеЕсли Тип(ТипРеквизитаМД) = ТипДата Тогда
    //Тип = Строка(ТипРеквизитаМД) + » [» + ТипРеквизитаМД.КвалификаторыДаты.ЧастиДаты+ «]»;
    Тип = ТипРеквизитаМД.КвалификаторыДаты.ЧастиДаты;
    ИначеЕсли Тип(ТипРеквизитаМД) = ТипБулево Тогда
    Тип = ТипРеквизитаМД;
    КонецЕсли;
    Исключение
    Тип = «»;
    КонецПопытки;
    
    Если Не Тип=»» Тогда
    Вернуть.Добавить(Тип);
    Продолжить;
    КонецЕсли;
    Попытка
    ТипМетаданных = Метаданные.НайтиПоТипу(РеквизитТип);
    Если ТипМетаданных=Неопределено Тогда
    Вернуть.Добавить(ТипРеквизитаМД);
    Продолжить;
    КонецЕсли;
    Исключение
    Вернуть.Добавить(ТипРеквизитаМД);
    Продолжить;
    КонецПопытки;
    
    Если Метаданные.Документы.Содержит(ТипМетаданных) Тогда
    Вернуть.Добавить(«Документ.»+ТипМетаданных.Имя);
    ИначеЕсли Метаданные.Справочники.Содержит(ТипМетаданных) Тогда
    Вернуть.Добавить(«Справочник.»+ТипМетаданных.Имя);
    ИначеЕсли Метаданные.Перечисления.Содержит(ТипМетаданных) Тогда
    Вернуть.Добавить(«Перечисление.»+ТипМетаданных.Имя);
    ИначеЕсли Метаданные.ПланыСчетов.Содержит(ТипМетаданных) Тогда
    Вернуть.Добавить(«ПланСчетов.»+ТипМетаданных.Имя);
    ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ТипМетаданных) Тогда
    Вернуть.Добавить(«ПланВидовХарактеристик.»+ТипМетаданных.Имя);
    КонецЕсли;
    КонецЦикла;
    
    ВернутьСтрока=»»;
    Для нн=1 по Вернуть.Количество() Цикл
    ВернутьСтрока=ВернутьСтрока+Вернуть[нн-1]+?(нн=Вернуть.Количество(), «», «, «);
    КонецЦикла;
    Возврат ВернутьСтрока;
    КонецФункции
    

    Показать

    Reply
  75. Altair777

    (73) 7OH, такая возможность уже есть

    все никак не дойдут руки выложить новую версию 🙂

    Reply
  76. Altair777
    Reply
  77. Altair777

    (73) 7OH,

    прошел ровно год, и я обновил разработку 🙂

    Reply
  78. pvlunegov

    Цены бы не было разработке, если бы прикрутить в нее редактор форм как в конфигураторе (без возможности изменения)

    Например, в форме есть реквизит, а как он называется в конфигураторе, я не знаю.

    Причем таких реквизитов (название на форме не совпадает с названием в метаданных) великое множество.

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

    Reply
  79. Altair777

    (78) pvlunegov, спасибо за столь лестный отзыв. И отдельно — за пожелание.

    Как мне кажется, кое-что сделать можно.

    Reply
  80. DrZombi

    Реально титанический труд, но есть камень в твой огород, можешь написать тоже самое, но для Тонкого клиента 🙂

    Все таки за ним будущее :_

    Reply
  81. Altair777

    (80) DrZombi, это был титанический труд, а переписывать для тонкого клиента — вдвойне 🙂

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

    Reply
  82. DrZombi

    Вот я валенок, только сейчас заметил, что работа Понравилась!!!

    Но как и раньше, такое бы и на тонком клиенте.

    Да еще с мастером запросов 🙂

    Reply
  83. Altair777

    (82) DrZombi, почти дозрел чтобы сделать на УФ 🙂

    Reply
  84. Berrimor

    100-ый плюсик в копилку 🙂 Работа титаническая, но практический смысл (при условии использования снегопата) извлечь из разработки сложно, имхо

    Reply
  85. Kyrales

    Ошибка при попытке открытия:

    {ВнешняяОбработка.Метаданные2Плюс.МодульОбъекта(617)}: Значение не является значением объектного типа (Имя)

    СтрокаДляСвертки.Что = СтрРекв[Реквизит].Имя;

    Reply
  86. user796659

    спасибо большое

    Reply
  87. check2

    Коллега, на платформе 8.3.10.2580 ошибка

    {ВнешняяОбработка.Метаданные2Плюс.МодульОбъекта(62)}: Ошибка при вызове метода контекста (ПолучитьСтруктуруХраненияБазыДанных)

    ТЗТаблиц = ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИменаБазыДанных);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’)

    {

    Для платформы 8.3 нужно как то по другому… Это ошибка платформы, и её до сих пор не исправили 🙁

    не понимают они фильтр по константам

    https://partners.v8.1c.ru/forum/message/1703511

    Reply
  88. check2

    (87)

    Здесь тоже, поправьте, если Характеристики объекта «кривые», то падает. Выделено жирным

    Процедура НовСтрХарактеристики(Коллекция, Реквизит=»», ВсеРеквизиты=Ложь, ИмяТЧДополнительно=»»)
    
    Стр = ДобавитьСтр(ИмяТЧДополнительно);
    Стр.Идентификатор = Алт_РазбитьПоЗаглавнымБуквам(Коллекция);
    Стр.ВсеРеквизиты = ВсеРеквизиты;
    
    Набор = ОбъектМД[«Характеристики»];
    СборнаяСтрока = «»;
    Для Инд = 0 По Набор.Количество()-1 Цикл
      Если Набор.Получить(Инд).ЗначенияХарактеристик = Неопределено Тогда
    Продолжить;
    КонецЕсли;
      СборнаяСтрока = СборнаяСтрока + «, » + Набор.Получить(Инд).ЗначенияХарактеристик.Имя;
    КонецЦикла;
    Стр.Представление = Сред(СборнаяСтрока,3);
    
    КонецПроцедуры
    

    Показать

    Reply
  89. check2

    (87) Вышел из ситуации, просто убрав параметр из вызова, понятно что работает таки образом дольше… Полезная разработка! Куда плюсы ставить то? Про УФ уже писали, могу только присоединиться. Не всегда теперь доступ дают, чтобы толстого клиента можно было запускать…

    Reply

Leave a Comment

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