<?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='\
плюсану авансом… позже гляну… делал как-то такую, тока без построителя… хотя по мне, лучше сюда СКД замутить…
(1) если обоснуете чем СКД для отбора круче построителя, замучу СКД 🙂
можно вот такие отборы делать:
(3+) Точнее, можно делать даже группы отборов с условиями И, ИЛИ и т.д.
Абалденная вещь. Лучшая из найденных (бесплатных)
Спасибо, ибо ………………………….. (почему сам не сделал, каждый добавит или придумает ) 😀
Исправь ошибку
ИначеЕсли ДействиеУдалить = 1 Тогда //Нужно «2»
// выполнение алгоритма
За обработку +
Спасибо огромное
Благодарю. Обработка помогла.
Обработка отличная. Давно искал такую. 🙂
(7) а почему нужно 2? где ошибается и на чем?
(5), (6), (7), (8), (9), (10). Вам всем спасибо за время , которое Вы потратили, чтобы выразить свое мнение.
Ваше мнение всегда очень важно для меня.
ну не логично же
Если ДействиеУдалить = 0 Тогда
// удаление записей
ОбработаноЗаписей = 0;
УдалитьЗаписи(ТаблицаРезультат, ОбработаноЗаписей);
Предупреждение(«Обработано » + ОбработаноЗаписей + » зап.», 15);
ИначеЕсли ДействиеУдалить = 1 Тогда
//Изменение записей
ОбработаноЗаписей = 0;
ИзменитьЗаписи(ТаблицаРезультат, Реквизиты, ОбработаноЗаписей);
Предупреждение(«Обработано » + ОбработаноЗаписей + » зап.», 15);
ВыполнитьОтбор(); // заново считаем набор
ИначеЕсли ДействиеУдалить = 1 Тогда
// выполнение алгоритма
ТекстАлгоритма = ЭлементыФормы.ТекстПроизвольногоАлгоритма.ПолучитьВыделенныйТекст();
Если СтрДлина(ТекстАлгоритма) = 0 Тогда
ТекстАлгоритма = ЭлементыФормы.ТекстПроизвольногоАлгоритма.ПолучитьТекст();
КонецЕсли;
ОбработаноЗаписей = 0;
ВыполнитьАлгоритм(ТаблицаРезультат, ТекстАлгоритма, ОбработаноЗаписей);
Предупреждение(«Обработано » + ОбработаноЗаписей + » зап.», 15);
ВыполнитьОтбор(); // заново считаем набор
КонецЕсли;
(11) Как правильно замечено в (7) и (12) Вариант:
ИначеЕсли ДействиеУдалить = 1 Тогда
повторяется дважды, т.е. 3-й вариант (ДействиеУдалить = 2) не сработает, нужно исправить
Очень ценю Ваши статьи и обработки, потому считаю данную ошибку мелкой опиской!
(7), (12), (13)
Проверил, действительно опечатка вышла. Спасибо, коллеги.
Исправил, прикрутил фантик.
Пользуйтесь на здоровье
(0) Ошибка в обработке исключений при попытке записи неверных данных в регистр сведений
Вместо
Правильно писать
Иначе будет исключение и обработка остановится 🙁
(15) + Ну и вообще СтрокаТаблица.НомерСтроки там еще встречается, также нужно устранить.
Все не доходили руки сделать подобное.. но сейчас с успехом использую эту обработку. Спасибо огромное…
(15), (16) там же вроде как «СтрокаТаблицы» — это строка таблицы значений… или я чего-то неправильно помню ?
Прекрасно работает. Очень пригодилась +100500
Спасибо, очень пригодилась…
Спасибо, обработка очень выручила.
Обработка замечательная, автору респект!
Обработка реально очень полезная. Однозначно +
Большое спасибо. Очень помогло. Конечно, можно и самому было регистры обработать…но на программирование время бы ушло, а так быстро и хорошо. Не раз еще выручит.
Спасибо, + автору
Пытаюсь выполнить код:
(Регистр сведений Штрихкоды — штрихкоду надо установить ед.измерения как у владельца базовая)
Объект.ЕдиницаИзмерения = Объект.Владелец.БазоваяЕдиницаИзмерения;
Объект.Записать(Истина);
что-то не взлетает…
(26) Не знаю какая у вас конфигурация, но, возможно, идет несовпадение типов данных. Например, «ОКЕИ» и «Единицы измерения». Проверьте.
Точно, несовпадение типов…
4 утра — туплю однако ….
Спасибо, пригодилось. Нужная в хозяйстве вещь
Большое спасибо!!! ооочень пригодилась!!!
Спасибо.Использовала для приведения в порядок штатного расписания
Классная обработка! Давно искал, спасибо Поручику за наводку!
Все замечательно! Но странно что не видно сколько записей то найдено. Это что никому не интересно сколько он чего грохнет или заменит? Или все выводят в список и смотрят что же там внизу за цифра 🙂 Я конечно понимаю что бесплатное, но сам то как угадываеш то?
И вот еще интересно можно ли ее так универсально сделать чтобы например отобрать те записи у которых Измерение/Ресурс имеет указанный тип, например «Справочник.ДоговораКонтрагентов»? А то ведь и такие замутки встречаются, именно они создают сложность.
Если у кого идеи есть — выкладывайте, может кто и доработает.
работает отлично 🙂
сделал ширину колонок не более 25
Спасибо большое!
Скажите, с помощью данной обработки я смогу убрать из значений регистра пробелы?
(36) а что Вы понимаете под пробелами в регистре сведений ?
(37) Конфигурация 1С Аптека.
В ней есть регистр сведений Штрихкоды, в нем есть измерение Штрихкод типа ПланВидовХарактеристик.
В самом плане видов характеристик хранятся строковые значения длиной 200 символов.
Сейчас у меня для номенклатуры штрихкоды представляют такое значение
, из-за чего при печати этикеток выходит ошибка компоненты barcode о неверном штрихкоде. В ручную поправил несколько штрихкодов, после чего печать этикеток для них заработала. Вот, хочу исправить все значения теперь в регистре сведений.
(38) из Вашего описания проблемы я понял, что править то надо не регистр сведений, а план видов характеристик.
Теоретически эта обработка может помочь: Отобрать записи РС, где реквизит ПВХ реквизита штрихкод содержит пробел. Далее с помощью выполнения произвольного кода можно получить объект ПВХ, обрезать пробелы и записать его обратно.
(39) Спасибо
старовата однако. надо бы уже модифицировать под 8.2, 8.3 и управляемое приложение
Подскажите пож… а можно устранить ошибку вашей обработкой в счетах?
Ошибка в прошлых годах :»Выполните повторно регламентную операцию «Закрытие счетов 20, 23, 25, 26″ за тот месяц, в котором образовалось отрицательное сальдо»
(42) тут дело не в счетах и не в регистрах сведений, а в проводках. Если у вас образовалось отрицательное сальдо на затратных счетах, то, либо как-то скорректировать вручную, либо перезакрывать соответствующий месяц с возможной пересдачей отчетности, если такое пеерзакрытие повлияет на финансовые результаты.
Хорошая обработка.
Спасибо, отлично сработало для коррекции штрихкодов в УТ10
Поменяйте в коде (стр 310) Если НЕ СтрокаТаблицы.ПомМетка Тогда
на Если НЕ СтрокаТаблицы.Пометка Тогда
Не работает.
21.10.2015 22:09:56
Ошибка создания источника доступных настроек компоновки данных
1С:Предприятие 8.3 (8.3.6.2332)
Система проектирования прикладных решений, редакция 1.1 (1.1.10.4)
(46) Уточните, пожалуйста, в какой версии обработки такой код и в каком модуле (формы, объекта).
(47) попробуйте запустить в толстом клиенте. Кажется такая ошибка случается в тонком
Все просто и понятно. Спасибо за работу!
Версия для «управляемого приложения» работает только в «толстом клиенте»?
(50) в толстом клиенте работает как было задумано. А в тонком наблюдаются какие-то необъяснимые спецэффекты — в отборе нельзя выбрать свойства измерений/ресурсов/реквизитов, если они являются ссылками на объекты; при смене регистра сведений вообще бывают ошибки инициализации СКД. Видимо у меня не хватает каких-то знаний и навыков для борьбы с этими багами.
Большое спасибо.
На УФ не читает регистр «ПрисоединенныеФайлы»
(53) Исправил ошибку, обработку перезалил. Спасибо за Ваше сообщение
Все комменты не читал.
1. На скринах нашел «ЭтаФорма». В 8.3 без режима совмести «ЭтаФорма» уже «ЭтотОбъект».
2. Как обстоят дела с модальностью и асинхронностью?
(55)
1. В 8.3 в управляемых формах не «ЭтотОбъект», а «Объект». А вот при выполнении на серере доступ к данным формы идет чере «ЭтаФорма». Вроде как все работает.
2. Модальных окон нет. Асинхронности тоже (во всяком случае пока).
(56) 1.
Нельзя использовать имена переменных, совпадающие с новыми свойствами, которые появились в «1С:Предприятии 8.3»:
Новое свойство ЭтотОбъект в управляемых формах и общих модулях.
Новые свойства в управляемых формах:
АвтоНавигационнаяСсылка,
НавигационнаяСсылка,
ВертикальнаяПрокрутка,
ОписаниеОповещенияОЗакрытии,
ПараметрыВыбора.
Для устранения несовместимости необходимо найти переменные и реквизиты форм с такими названиями и переименовать их.
Свойство управляемой формы ____ ЭтаФорма (ThisForm) ______ ЭтотОбъект (ThisObject)
(57) а я и не объявляю эти переменные, просто подсказка как можно добраться до реквизитов формы. Если используется другая версия платформы, где произошла замена, следует пользоваться новыми свойствами формы и объекта
Неизвестная ошибка. В ЖР пусто…
(59) Попробуйте работать в толстом клиенте. В тонком клиенте многие операции с метаданными недоступны. Из-за этого и появляются такие странные ошибки.
Платформа: 1С:Предприятие 8.3 (8.3.7.1993)
Режим: Файловый (без сжатия)
Приложение: Толстый клиент
Вариант интерфейса: Такси
Ошибки:
———————————————————————————
Ошибка создания источника доступных настроек компоновки данных
Воспроизводится при удалении записей.
(61) Уточните, пожалуйста в какой момент времени происходит ошибка: в момент после нажатия на кнопку «Выполнить чтение данных регистра» или при удалении после нажатия на кнопку «Выполнить удаление»?
Если работаете в стандартной конфигурации, то прошу так же уточнить конфигурацию, релиз, имя регистра и настройки отбора. Может быть мне удастся смоделировать ситуацию. До сих пор с такой ошибкой сталкивался только в тонком клиенте, но Вы указали, что режим запуска «Толстый клиент».
Хорошая и полезная обработка. +1
(62)
Аналогичная ситуация. Происходит при нажатии кнопки «Выполнить удаление».
Удалял записи РС Аналитика учета НДС
Платформа: 1С:Предприятие 8.3 (8.3.8.1747)
Конфигурация: Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.43.241)
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)
Вариант интерфейса: Такси
Ошибки:
———————————————————————————
11.07.2016 9:28:16
Ошибка создания источника доступных настроек компоновки данных
(64) Это очень странно. При нажатии на кнопку «Выполнить удаление» начинается работа с таблицей данных на форме и регистром сведений. Компоновщик настроек при этом никак не используется.
Обратите внимание, что 29.04.2016 я разместил обновление обработки, которая корректно работает в тонком клиенте. Если Вы скачивали обработку ранее, попробуйте скачать обновленную
У меня ошибка никак не воспроизводится. Но где-то проскальзывало сообщение, что подобная ошибка возможна на некоторых релизах платформы. Чаще проявляется, если установлена низкая скорость соединения.
Спасибо! Обработка помогла, но нужно поправить:
{Форма.ФормаУправляемая.Форма(316)}: Поле объекта не обнаружено (Помметка)
Если НЕ СтрокаТаблицы.Помметка Тогда
нужно было в регистре РезультатыОбменаДанными убить запись с пустой ссылкой, там их было 3 шт
не вышло — в обработке УФ написано ЭтотОбъект, а нужно было Объект (удалял в Рознице 2.0)
а потом выяснилось что отобранные объекты удаляются по одному и сначала прочитать, потом удалить — а прочитать вызывает ошибку — более 1 записи по ключевым полям
так что удаление не удалось, редактирование невозможно по тем же причинам
пришлось свою обработку использовать, там также ЭтотОбъект править пришлось, она всетаки была изначально для КА, УТ — все что на 8.2 с УФ
но вот процедура по удалению справилась:
Показать
(66) Ошибку исправил, большое спасибо
(67) не очень понял что там с Объект или ЭтотОбъект: где и что надо исправлять
Что касается ошибки при попытке чтения записей регистра, так у вас получается данные практически нечитаемые. Можно было сделать тестирование и исправление ИБ. Система бы сама нашла такие дублирующиеся по ключевым полям записи и удалили их.
Спасибо за обработку, НУЖНАЯ ВЕЩЬ В ХОЗЯЙСТВЕ )
Есть в БП 3.0 регистр сведений «Ставки налога на имущество по отдельным основным средствам». На начало года в нем вводятся ОС с льготными ставками. Можно с помощью вашей обработки отобрать на начало прошлого года все элементы и скопировать (создать) новые с другой льготной ставкой на начало текущего года ?
P.S. Попробовал изменить старые ставки — Выдает ошибку при попытке простого изменения на этом регистре — «Строка таблицы 1: Не смог идентифицировать запись». И так все остальные строки.
(71) Обнаружил ошибку определения того, что регистр периодический Ошибку исправил. Скачайте обработку заново и попробуйте.
Но. Изменение реквизитов (период и ставка) может привести к тому, что у вас просто изменятся существующие записи. Попробуйте на одной.
Достоверно могу сказать, что можно использовать алгоритм для создания новых записей.
Я извиняюсь, программировал сам очень давно на 7.7 и 8.2 — можно пример простейшего кода создания элемента регистра сведений для вашей обработки ?
Вроде разобрался. На всякий случай оставлю это здесь — вдруг кому то еще пригодится:
НоваяЗапись = РегистрыСведений.СтавкиНалогаНаИмуществоПоОтдельнымОсновнымСредствам.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = НачалоГода(ТекущаяДата());
НоваяЗапись.Организация = ЗаписьРС.Организация;
НоваяЗапись.ОсновноеСредство = ЗаписьРС.ОсновноеСредство;
НоваяЗапись.КодПоОКТМО=ЗаписьРС.КодПоОКТМО;
НоваяЗапись.КодПоОКАТО=ЗаписьРС.КодПоОКАТО;
НоваяЗапись.ПостановкаНаУчетВНалоговомОргане=ЗаписьРС.ПостановкаНаУчетВНалоговомОргане;
НоваяЗапись.НалоговыйОрган=ЗаписьРС.НалоговыйОрган;
НоваяЗапись.ПорядокНалогообложения=ЗаписьРС.ПорядокНалогообложения;
//НоваяЗапись.НалоговаяСтавка=ЗаписьРС.НалоговаяСтавка;
НоваяЗапись.КодНалоговойЛьготыОсвобождениеОтНалогообложения=ЗаписьРС.КодНалоговойЛьготыОсвобождениеОтНалогообложения;
НоваяЗапись.СниженнаяНалоговаяСтавка=1.6;
НоваяЗапись.ВидИмущества=ЗаписьРС.ВидИмущества;
НоваяЗапись.ДоляСтоимостиЧислитель=ЗаписьРС.ДоляСтоимостиЧислитель;
НоваяЗапись.ДоляСтоимостиЗнаменатель=ЗаписьРС.ДоляСтоимостиЗнаменатель;
НоваяЗапись.НалоговаяБаза=ЗаписьРС.НалоговаяБаза;
НоваяЗапись.КадастроваяСтоимость=ЗаписьРС.КадастроваяСтоимость;
НоваяЗапись.НеоблагаемаяКадастроваяСтоимость=ЗаписьРС.НеоблагаемаяКадастроваяСтоимость;
НоваяЗапись.КадастровыйНомер=ЗаписьРС.КадастровыйНомер;
НоваяЗапись.КадастровыйНомерПомещения=ЗаписьРС.КадастровыйНомерПомещения;
НоваяЗапись.ДатаРегистрацииПраваСобственности=ЗаписьРС.ДатаРегистрацииПраваСобственности;
НоваяЗапись.ДатаПрекращенияПраваСобственности=ЗаписьРС.ДатаПрекращенияПраваСобственности;
НоваяЗапись.ИспользуетсяТолькоВДеятельностиОблагаемойЕНВД=ЗаписьРС.ИспользуетсяТолькоВДеятельностиОблагаемойЕНВД;
НоваяЗапись.ДвижимоеИмуществоПодлежащееНалогообложению=ЗаписьРС.ДвижимоеИмуществоПодлежащееНалогообложению;
НоваяЗапись.Записать(Истина);
(74) Можно и короче:
Странная ситуация — на другом компьютере на новой версии обработки вышла такая же ошибка «Строка таблицы 1: Не смог идентифицировать запись».
На моем компьютере при запуске новой версии ошибка тоже выходила — не помню в какой момент она перестала выходить.
(76) Ситуация действительно странная. Воспроизвести не могу
На демо базе последней версии 3.0 отрабатывает нормально, на типовой рабочей базе 3.0 последней версии (на этом же компьютере и этой же платформе) вылетает ошибка.
Понял в чем дело…. Если организация одна в базе, то реквизит «Организация» (и возможно какие-то другие) не заполняется.
Этот реквизит заполнится автоматом, если ввести еще одну организацию. В демо базе несколько организаций и все реквизиты заполнены.
В обработке, видимо, проверяются все реквизиты при попытке изменении и если чего-то не хватает, то вылетает эта ошибка «Строка таблицы : Не смог идентифицировать запись».
(79) У меня немного устаревшая версия этой конфигурации. У измерения «Организация» стоит признак контроля заполненности.
При этом действительно, если организация одна, то она в регистре не заполняется.
Как они обходят это ограничение интересно… и зачем…?
При этом, когда создаешь объект «МенеджерЗаписи», заполняешь значения измерений из выборки (помним, что организация пустая) и пытаемся прочитать запись, она не находится в регистре 🙁 МенеджерЗаписи.Выбран() = Ложь
Как обходить пока не знаю. Только если через набор записей и его отборы….
Поставлю себе на заметку
За обработку +, думаю понадобится
Списибо, помогла.
<del>
согласен с «33»
Действительно нужен фильтр по типу объекта.
Потому что при попытке отфильтровать регистр по составному полю запрос валит сервер очень легко. Например в ERP только одних документов сотня типов, и в каждом куча элементов.
Без отборов типа таких, составные поля вешают SQL сервер:
ВЫРАЗИТЬ(ДанныеПоследнихОповещений.ИсточникОповещения КАК Документ.Заказ).ПометкаУдаления = ИСТИНА
(86)
короче допилил — добавил строковое поле для доп. условий и в коде его учёл
если кому надо — файл во вложении