Загрузка данных из табличного документа в справочники, документы, планы видов характеристик, планы видов расчетов, планы счетов, бизнес-процессы, задачи, в движения документов, поточная загрузка документов (EXCEL, управляемые формы, универсальная)
1C-admin
14.03.2019
Принцип обмена данными из 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='\
Зачем же плодить одно и тоже , хоть бы кто сделал возможность сохранения и восстановления настроек настроек ?
Хотя то что получает ссылку на документ сама . уже хорошо. Но придётся допиливать.
(2) ben_art, так оно там и так есть? или нужно конкретно, что бы в базе сохранялись настройки?
(3) Уже разобрался прошу прощения за первый коммент , меня смутила запись о не возможности сохранения настроек , а она оказывается есть и в список и в файл )
Баян. Автор, как насчёт загрузки картинок, работы с объединёнными ячейками, формулами, иерархией строк? Как насчёт скрытых разным образом строк?
(5) Yashazz, может вам еще ключи от квартиры где деньги лежат?
После загрузки сохраненных настроек, поля ВИД ДОКУМЕНТА и ТАБЛИЧНАЯ ЧАСТЬ не устанавливаются из настроек.(у себя исправил)
(7) hzhz, исправил, спасибо за замечание)
Уважаемый qwinter!
Можно ли с помощью вашей обработки формировать номенклатуру с характеристиками с определенными свойствами (все свойства характеристики номенклатуры задаются в соответствующих полях файла загрузки)?
(9) marinasnsd, с помощью этой обработки настроить загрузку номенклатуры сразу с характеристиками, можно только зная программирование 1С (так как например в УТ11 характеристики это отдельный справочник).
Подскажите пожалуйста как восстанавливать параметры при открытии формы ?
(11) ben_art, не совсем понял, что вы именно хотите?
Ну в 8.2 на обычных формах , настройки сохранялись с возможностью восстанавливать их при открытии формы. чтоб не нажимать кнопку «восстановить настройки» а они сами востанавливались
(13) ben_art, для управляемых форм такого в пользовательском интерфейсе нет. Откройте обработку в конфигураторе, и в свойствах формы поставьте: автоматически сохранять значения.
да с этим понятно , я знаю что сохранение и восстановление происходит только в форме на клиенте (не как в 8.2) , вот и спрашиваю может есть способы вызывать команду восстановления без нажатия кнопки. (
(15) ben_art, чтобы была кнопка восстанавливать автоматически или нет? Можно сделать реквизит, и при открытии присваивать его свойству формы.
(9) marinasnsd, а вот теперь можно)))
(15) ben_art, добавил и такую возможность)))
Ого , спасибо огроменное )
только теперь ещё и ссылку на объект сохраняет , а надо чтоб был тот из которого вызвана
(20) ben_art, посмотрю.
(22) Спасибо заработало )))
В модуле формы (Строка 894) ошибка:
(24) onyx, я так понял, это по поводу обновления данных найденных элементов справочников? Это поведение стандартной типовой загрузки, а не ошибка, она не обновляет данные. Как показали вы, ни в коем случае нельзя делать. Это нарушит логику загрузок всего остального, кроме справочников.
Если вы хотите обновлять данные справочников, то надо чуть выше после:
Показать
добавить:
То же самое сделать в процедуре: ЗагрузитьПодчиненныеСправочники
И воспользоваться соответствующей настройкой
qwinter (Павел) могли бы вы дать ваши контактные данные (почта) для связи?
мой kidus@yandex.ru
Отличная обработка! Спасибо!
Отличная обработка! Спасибо, большое.
Не смотря на то, что я использовал ее в самописной конфигурации и пришлось чуть-чуть допилить — работает идеально. Позволила сэкономить действительно много времени на ввод первичной информации.
Автору респект и плюс в карму!
(28) RakovskiyK, а что если не секрет допиливали? Она вроде должна и так работать в самописных конфигурациях.
Подскажите, пожалуйста, возможно ли с помощью Вашей обработки выгрузить данные из таблицы Excel (6-10 столбцов )в документ Взаимозачеты задолженности в УТ 11. Позволяет ли Ваша обработка непосредственно после загрузки в табличную часть обработки данных из excel выбрать нужный документ и загрузить туда предварительно отображенные данные ? Спасибо.
(30) xten, Вы немного сумбурно построили вопрос, и я немного его не понимаю. Вам требуется после открытия документа эксель и получения дынных выбрать друго отличный от первоначального документ? Обработка работает по принципу, Вы выбираете документ (принадобности табличную часть или движение по регистру) и настраиваете загрузку, потом открываете документ эксель, и затем загружаете данные.
Извиняюсь, возможно некоректно вопрос поставил, два дня только с УТ 11 работаю )) Значит, как я понимаю, органичений по конкретному типу документов нет? Загружаить из ексель можно в табличную часть любого документа?
(32) xten, Вы все поняли правильно, нет никаких ограничений, можно загружать в любую табличную часть, любого документа или справочника.
Супер, ОГРОМНОЕ СПАСИБО ВАМ !!! )))
Отличная обработка! Спасибо!
Отлично, Молодцы!!!
У меня версия:
1С:Предприятие 8.2 (8.2.17.153)
Управление торговлей, редакция 10.3.13.2 (10.3.13.2.2)
При открытие файла ЗагрузкаДанныхИзТабличногоДокумента_Q(Управляемые формы).epf
выдает ошибку:
{ВнешняяОбработка.ЗагрузкаДанныхИзТабличногоДокумента_УФ.МодульОбъекта(40,21)}: Переменная не определена (СтроковыеФункцииКлиентСервер)
ВызватьИсключение <<?>>СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
Подскажите, что не так.
(37) Гость, замените:
на
И
на
При загрузке в ПТУ (либо регистр сведений Штрихкоды НМКЛ), поиск по характеристикам общим для вида номенклатуры не идет по наименованию для вида номенклатуры. А так обработка очень хорошая, съэкономила достаточно личного времени
(39) yaguarrr, немного подправил обработку. Теперь такую настройку можно сделать, вот таким образом:
Устанавливаете режим загрузки: Загрузка в регистр сведений. Затем добавляете справочник: Виды номенклатуры, настраиваете загрузку их. Затем добавляете справочник: Характеристики номенклатуры, и в нем в поле владелец ставите устанавливать по настройке Вид номенклатуры и настраиваете поиск по требуемым элементам. А затем в настройке загрузки в регистр в поле характеристики ставите устанавливать по настройке Характеристики номенклатуры.
(40)
Все взлетело — и для регистра сведений и для документа ПТУ, полет нормальный. Благодарю за сверхоперативность.
Неплохо бы добавить данный пример в описание обработки, не каждый сам с первого раза сделает
Автор выручай 😉
Зарплата и кадры бюджетного учреждения, редакция 1.0 (1.0.51.1)
При открытии говорит:
{ВнешняяОбработка.ЗагрузкаДанныхИзТабличногоДокумента_УФ.МодульОбъекта(40,21)}: Переменная не определена (СтроковыеФункцииКлиентСервер)
ВызватьИсключение <<?>>СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
Люди добрые, подскажите, а как бы заставить обработку не вставлять строку в табличную часть документа, если не было найдено значение в справочнике 1С по коду для одного из полей текущей строки табличного документа
Допустим: бежит обработка по табличному документу, считывает значение артикула из табличного документа, пытается найти номенклатуру в 1С по данному артикулу, не находит и как следствие не создаёт строку в вводе остатков, плавно переходя к обработке следующей строки табличного документа.
(42) dvsidelnikov, чуть выше уже было описано, как исправить. Запихните код в оператор Выполнить.
(43) dvsidelnikov, в событии «После добавления строки»:
Здравствуйте!
При нажатии «Загрузить»
Конфигурация «Розница», платформа 8.3
Сообщение — «Использование модальных окон в данном режиме запрещено»
что делать?
спасибо
(46) zzzhen,
Всю процедуру «КомандаЗагрузить» заменить на:
Показать
в УТ для Украины редакция 3
не работает регистрация обработки в базе:
{Форма.Форма.Форма(4652)}: Ошибка компиляции при вычислении выражения или выполнении фрагмента кода
Выполнить(»
по причине:
{(2,95)}: Переменная не определена (ЭтотОбъект)
ОписаниеОповещения = Новый ОписаниеОповещения(«ЗарегистрироватьвИБПослеПомещенияВХранилище», <<?>>ЭтотОбъект);
Люди добрые, а загрузка в табличную часть справочника имеет место быть? что-то я не нашёл.
(49) dvsidelnikov, в режиме «Поточная загрузка».
Работало, после обновления сломалась 🙁
(51) an.azarova, здравсвуйте. Какую ошибку пишет? Какая конфигурация?
{Форма.Форма.Форма(473)}: Значение не является значением объектного типа (Свойство)
СостояниеВыполнения.Свойство(«ТекущаяВерсия», ВосстановленнаяТекущаяВерсия);
УНФ 1,5,20
(53) an.azarova, у меня не воспроизводится. Что именно произошло когда перестало работать? У Вас, что то произошло с сохраненными настройками.
Как вариант замените:
на:
Спасибо помогло
Скачал. Попробую на ERP 2.0 при подготовке НСИ базы.
Павел, прошу прощения за вопрос дилетанта, не могу разобраться с настройкой. Задача такая, есть дополнительные реквизиты вида номенклатуры «Для характеристик» (например, Размер и Цвет) со списком значений. Имеется ли возможность данной обработкой произвести сопоставление при загрузке характеристик с уже имеющимися в списке значением? Пробую пакетную загрузку характеристик, выбираю ТЧ Дополнительные реквизиты и получаю ошибку на выходе:
Буду очень признателен за помощь!
P.S. Сорри за такое отображение кода, не могу понять что это, оригинал вот:
{Форма.Форма.Форма(2162)}: Поле объекта не обнаружено (Дополнительные значения)
(57) BodunOff, а какая конфигурация? Ошибка происходит сразу после выбора ТЧ? Я попробовал в УТ 11.1 у меня все грузится.
Принцип работы Вами выбран правильно. Выбираете поточную загрузку справочника, добавляете табличную часть. Не забывайте по возможности ограничивать типы получаемых значений, например в УТ11 в реквизит Значение в табличной части «дополнительные реквизиты» имеет очень много типов, лучше ограничить его до одного нужного.
Конфигурация УТ 11.1.9.56. Ошибка происходит на этапе проверки внесенных данных. Выбираю следующие значения, см. скрины.
Так и выбираю один тип «Дополнительное значение» чтобы оно к табличной части пробилось
(60) BodunOff, это ошибка в функции: «ПолучитьВозможныеЗначения»:
замените:
на
Показать
или скачайте обновленный файл.
(60) BodunOff, однако для загрузки дополнительных значений, надо еще создать дополнительную настройку для справочника «Дополнительные значения» и установить ее как используемую для значения дополнительных значений. Пример во вложении.
Спасибо огромное! Всё получилось как надо!!! Если бы можно было поставить ещё пару звёзд они все были бы ваши, я искал эту обработку с момента перехода на управляемые формы)))
БГУ 8.2
обработка не запускается
(64) Гость, откройте БГУ в режиме «управляемое приложение».
(65) Спасибо открылась , но теперь при загрузке таблицы данных дает ошибку (в прикрепл.файле) БГУ 8.2.18.96 Конфигурация 1.0.25.9
(66) Гость, ошибку исправил, скачайте обновленную обработку, или в модуле формы:
заменить на:
Павел, возникла проблема загрузки характеристик номенклатуры (с доп. реквизитами) в одну из баз УТ 11. Не могу ни объяснить толком ни отловить самостоятельно ошибку. По-возможности напишите мне в скайп pavel.bodunov в любое удобное для Вас время для настройки на возмездной основе.
не работает что?
Добрый день,
1С:Предприятие 8.3 (8.3.5.1231)
Управление торговлей, редакция 11.1 (11.1.9.44)
пытаюсь загрузить реквизиты как дополнительные значения. Во вложении настройки.
Во время загрузки получаю ошибку, хотя предварительная загрузка в таблицу данных проходит успешно
{Форма.Форма.Форма(1570)}: Значение не является значением объектного типа (Ссылка)
Возврат ЗагружаемыйОбъект.Ссылка;
Не могу понять — это я что-то делаю неверно?
Спасибо.
(71) rez222, ошибка на последней версии воспроизводится?
Разобрался. Дело было в используемой версии обработки.
Павел, спасибо!
Возник другой вопрос —
возможно ли настроить загрузку начальных остатков по контрагентам в табличную часть по типу расчетного документа — договор, счет, реализация и т.п.с подстановкой в «номер» ссылки на документ соответсвующего типа?
(73) rez222, честно говоря не понял вопроса. Опишите подробнее.
Обработка позволяет считать данные и произвести настройки, но при попытке загрузки данных в базу выдает ошибку:
{(2,78)} Переменная не определена (ЭтотОбъект)
помогите — бухгалтера плачут, говорят, что ждать не могут
(75) isteroid, какая у вас конфигурация? Какая версия конфигурации? И какая версия платформы?
Не получается загрузить данные 🙁
Ругается еще на этапе проверки заполнения
Задача — установить для номенклатуры единицы измерения.
ут10
Таблица:
Артикул Единица_Наименование
Единицы — подчинены номенклатуре, созданы
Искать — по наименованию и владельцу (<Создаваемый объект>?), который задан артикулом. Настройка такая есть, но она не работает :(((
Пока выход видимо использовать «Вычислять», но как-то это не кошерно.
(75) isteroid, исправил.
(77) Rebelx, добавил в обработку функционал для подобных загрузок данных.
как восстанавливать старые данные при открытии новой формы?
(79) Litvin2015, какие старые данные?
Как с помощью обработки создавать новые элементы справочника. Я создаю заказ поставщику. Данные в табличное поле документа все заполняются. Надо чтобы если нет номенклатуры, то номенклатура сама создавалась.
(81) intersoft_1c, после настройки основной таблицы добавляете настройку загрузки номенклатуры кнопкой «Добавить справочник», а в настройке табличной части документа у номенклатуры ставите режим «Устанавливать» и в значение по умолчанию выбираете настройку загрузки «1: Номенклатура».
(82)
А как надо настраивать справочник Номенклатуру, чтобы он искал по артикулу, если не нашел, то создать номенклатуру.
(83) intersoft_1c, устанавливаете в настройке номенклатуры реквизиту «Артикул» настройку что он «Поле поиска»
П(84) Поставил галочку, что он поле поиска, Режим загрузки установил Искать, указал колонку поиска. Номенклатура не ищется а в поле артикул в таблице данных в таблице 1.Номенклатура выходит просто Артикул, а в таблице Настройка Номенклатура вообще пустая
(85) intersoft_1c, загрузку данных непосредственно делали? При получении таблицы данных так и должно быть.
(86) Все получилось,Спасибо. Еще вопрос. Можно сделать так, чтобы поиск по артикулу происходило только в одной группе.
(87) intersoft_1c, реквизиту «Родитель» поставьте, что оно является полем поиска и режим устанавливать, и выберете требуемую группу. При не нахождении номенклатуры, новые будут создавать в этой же папке.
(88) Если так сделать, то он перестает искать по артикулу, сразу создает всю номенклатуру в этой папке.
(89) intersoft_1c, а вы при этом случайно с реквизита артику поле поиска не сняли?
(90) Нет не снимал. Такая задача уже не стоит, поиск сказали нужен по всей номенклатуре. Обработка хорошая, но только нет описания по настройке.
(91) intersoft_1c, сейчас даже на добавление в нее нового функционала времени особенно нет, так что описание на данный момент точно не в приоритете. Может кто то из пользователей захочет сделать такое доброе дело, думаю было бы востребовано. Можно даже сделать отдельную статью.
Прошу помощи!!! Я ни чего не могу поделать с загрузкой бух. проводок… ВидСубконто проставила. Но все равно не получается. Может делаю настройки неверно? Счета учета встают на место, сумма отображается корректно, но субконто пустое. Маюсь уже вторую неделю. Результат ноль. Буду очень признательна за помощь.
(93) alisaguzel, ограничьте искомые типы (колонка «Описание типов») оставьте там только справочник номенклатуры. Режим загрузки «Искать». Если не получится то прикрепите саму настройку и пример файла.
здравствуйте!
скачала обработку, пытаюсь разобраться
пытаюсь сохранить настройку — выдает ошибку «Поле объекта не обнаружено (Текущая версия)»
до этого каким-то волшебным образом сохранила настройку и поставила галку Открывать, и выдавало ошибку, как в (54), заменила в коде обработки — саму обработку открывает… но дальше сохранить настройки все равно не дает…
(338) oxana1, добавьте у формы реквизит: «ТекущаяВерсия», тип Строка(10). А так же в процедуре «ВосстановитьНастройкиИзСостоянияВыполнения» замените
на
(339) попробую, спасибо!
пока сложно, хоть и с типовой обработкой с ИТС знакома и грузила ею
Спасибо! Обработка уже не раз помогла.
Но загрузить настройки опять не получается, хотя ошибка в последней версии стала другой.
Настройка для загрузки в «Движения документа» в «Операцию» :
Платформа: 1С:Предприятие 8.3 (8.3.6.2100)
Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.43.123)
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)
Вариант интерфейса: Такси
Ошибки:
———————————————————————————
16.03.2016 16:24:13
{(1)}: Значение не является значением объектного типа (Метаданные)
Для каждого Движение Из СсылкаДокумента.Метаданные().Движения Цикл Если Движение.Имя = «Хозрасчетный» Тогда МетаданныеОбъекта = Движение КонецЕсли КонецЦикла;
(370) Такое бывает, если ссылка пустая.