<?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='\
+ за идею
😀 Дерзай дальше
Ставлю плюс не только за идею, но и за подробные рассуждения о том, как она разрабатывалась . Потому что одно дело просто выложить какую-то внешнюю форму, но если тебе нужна была просто идея, то нужно сидеть и додумываться что имел ввиду разработчик. Спасибо за труд
в бух не идет и прочее нет
To света1969
Постарайтесь не использовать печатную форму механически в любых конфигурациях, отличных от 1С 8.1 УПП.
Поймите принцип и создайте на его основе свою форму.
У нас в 7,7 для этих целей есть отдельный справочник, где в одном реквизите сотрудник, в другом (текстовом, периодическом) информация о доверенности. При печати документа, в частности счетов фактур и накладных дважды происходит выбор за кого и кто расписывается. Первый за гл. Бух, второй за Генерального 🙂
Итого корректировки в базе…
— 1 новый справочник
— По одной новой секции в каждый документ в который надо выводить печать с запросом на подпись
— ну и собственно в процедуре Печать() Запрос на выбор пользователей 🙂
Ну и в идеале — хранение картинок с факсимильными подписями для каждого выбираемого сотрудника, и их вставка в бланки…
А как при таком подходе узнать кто подписывал документ, например, в том случае если часть документов надо напечатать заново?
To Marks007
Предлагаемый мной вариант — способ избежать ручной правки уже сформированных печатных форм. Т.е. когда перебивают ручками ни о каком учете, кто печатал, речи быть не может.
Если же надо задним числом распечатать документ, оригинал которого утерян, то тут в любом случае должен подписывать новый сотрудник, тот, кто имеет право и есть в данный момент.
Если подписанный оригинал есть, то и копию сделать не составит труда.
Ну а когда речь о том, «кто мог подписать этот документ пол-года назад?», то либо всё печатаем через Уполномоченного (только один Зам в заданный период), либо кроим оригинальную конфу, добавляя в каждый документ подписантов. Как вариант-отдельный справочник с ФИО, должностью, местом подписи (Руководитель, Гл.бух …) и ссылкой на документ и печатную форму .
(9) Вопрос о правильном подходе к созданию ВПФ уже обсуждался. И все -таки, повторюсь.
На мой взгляд , правильным методическим подходом при разработке внешних печатных форм является разработка такой ВПФ , которая может запускаться как из документа так и независимо , т.е иметь реквизит формы СсылкаНаОбъект.
Отладка работы ВПФ осуществляется при независимом запуске (кнопка Открыть) и выбором нужного документа в реквизите формы СсылкаНаОбъект .
По окончании отладки обработка регистрируется как внешняя печатная форма.
(9)
Может выручить частное решение.Простое , не очень корректное , но при нестрогом учете и разреженном во времени вводе документов — допустимое.
Хранить во внешнем файле таблицу значений с двумя полями :
СсылкаНаУполномеченноеЛицо и СсылкаНаДокумент.
Организация процедуры проста. Вначале читаем таблицу из файла , подставляем ,если есть, нужное значение в реквизит Уполномоченный.
При печати записываем таблицу при помощи команды ЗначениеВФайл().
To Ish_2
http://www.infostart.ru/public/14686/
Есть замечательная универсальная обработка для отладки в конфигураторе внешних печатных форм с возможностью задания документа/справочника и параметров:
«Грузить» простенькую форму отладочным модулем не имеет смысла, когда есть такой инструмент.
(12) К сожалению , считаю , подход продемонстрированный по указанной
ссылке (poppy), как раз методологически неверным.
Ненужной придумкой .
И самым точным комментарием к теме считаю следующий (German) :
Тоесть запустить диалог и отлаживай сколько хочешь, из диалога так же вызывать Функцию модуля печать.
Прием позволяющий запускать обработку с одной стороны независимо,
с другой стороны из документа , настолько прост , что не заслуживает названия «отладочный модуль» .
(13) Там есть и другой комментарий от не менее уважаемого специалиста:
Напомню, для отладки обычной обработки, в отличии от ВПФ, не требуется добавлять в нее что-то ненужное.
Каждому — свое. Самая короткая дорога — та, которую знаешь.
(0)
Для этого можно использовать механизм свойств объектовhttp://infostart.ru/public/57375/
Свойства также можно использовать и для хранения того, кто подписал (8).
(11) Это к вопросу полезно ли знать механизмы типовых конфигурацийhttp://infostart.ru/public/60216/
(14) Спасибо, poppy.
Собрался похихикать над уважаемым специалистом , который произнес , нечто выдающееся :
Ан нет. По нику автора этого поста NewNick попадаю к себе в профиль. Poppy , это не я. Это support’у вопрос.
Но «уважаемого специалиста» в свете приведенной цитаты я оценил.
(16) Ты о чем?
Не поняла тебя в контексте применения слов «хихикать», «уважаемый специалист», «выдающееся» и «оценил специалиста в свете цитаты». Что ты имел в виду?
Кстати, профиль NewNick:http://infostart.ru/profile/9158/
Я о том :
1. Что приведенное в указанной цитате предложение мне кажется нелепым.
2. Что клик на нике NewNick ( как автора этого комментария в Вашей теме) приводит в профиль Ish_2 . Отсюда для наблюдателя возможен вывод , что я и есть автор такого комментария.
3. Я попытался откреститься от такого авторства. И не захотел быть «уважаемым специалистом».
(18)
п.1 Приведенная в (13) цитата не менее нелепа. Но это не делает Германа неуважаемым специалистом.
п.2 Тот клик приводит не в профиль Ish_2, но в профиль того, что кликает. Поэтому, для наблюдателя возможен вывод, что это он автор такого комментария, но не ты.
п.3 Открещивался зря… 😀
(19) Спасибо, Poppy.
Спасибо Автору!!! Наего примере усе с первого разо вышло!!!
Платформа 8.2. Проведена конвертация файла в Конфигуратеоре.
Ошибка:
{ВнешняяОбработка.Акт_с_любой_подписью.МодульОбъекта(516)}: Метод объекта не обнаружен (ПолучитьЧастьЗапросаДляВыбораСодержания)
СтрокаВыборкиПоляСодержания = ОбработкаТабличныхЧастей.ПолучитьЧастьЗапросаДляВыбораСодержания(«АктОбОказанииПроизводственныхУслуг»);
Что делать?
(22) Извините, давно не смотрел комментарии.
При изменении конфигураций функции общих модулей «дрейфуют» в другие модули или меняют имена.
Да и сами исходные печатные формы меняют содержание.
Поэтому совет: не копировать обработку «один к одному», а брать за основу. Заходить в модуль нужного документа, находить процедуру формирования данных для печатной формы и копировать в обработку. Затем менять её по принципам, изложенным в статье.
Тогда у вас будет всегда актуальная внешняя печатная форма.
Аналогично следует поступать и с макетом, если он сильно изменился.
Для НЕ ПРОГРАММИСТОВ! Хотите свою печатную форму, а программировать не хотите? Нет ничего невозможного. Пишите. Договоримся.
Взял за основу приведенный код. Попытался прикрутить к акту выполненных работ(реализация товаров и услуг) в БП-2.0.19.12, выбор отв лица работает и проставляет произвольное лицо, но не могу вытащить доверенность из комментария…значение все время пустое оказывается что может быть?как мне вытянуть из поля доп.Информация номер доверенности или может куда то еще можно прилепить этот номер доверенности?
Поможите пожалуйста. Мне еще по такому типу надо Счет сделать и СчетФактуру. А тупо статичным текстом в макете не очень хотелось бы вбивать.
так нужно просто эту доверенность сделать как регистр сведений и не париться с комментариями, плюс к тому сохраняется история доверенностей, на случай если они меняются. в форме обработки выбора подписанда добавить выбор доверенности, по-моему замечательно должно получиться.
да и вообще все данные о подписях в документе хранить в регистре сведений, это просто замечательная вещь в 8-ке!!!
Статья архиважная и архинужная. Огромная находка для чайников. Спасибо. )))
Огромное спасибо!
статья очень помогла мне)
Создал внешнюю форму, показал буху, что её можно открыть конфигуратором и изменить текст подписи — и копеечку себе заработал, и привнёс свет в этот мир. А если нужно более пяти замов — то у клиента не фирма, а проходной двор.
Хорошая статья буду использовать метод.
Сейчас актуальна, т.к. пишу внешнюю печатку на реализацию