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




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

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 не будет опубликован. Обязательные поля помечены *