Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35)




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

44 Comments

  1. dkonakov

    Спасибо, очень вовремя написанная статья!

    Reply
  2. dkonakov

    (2) Первыми столкнулись именно пользователи БП 3.0.

    Reply
  3. and_r

    Большое спасибо за статью! Уже голову сломал как вернуть печать, все сделал кроме общего модуля

    Reply
  4. Бубузяка

    1. Что касается БП 3.0, то эта статья для тех кто не знает, что это можно прочитать в файле «UpdateSSLhtm» в каталоге, куда устанавливается БСП 2.4. Скачайте БСП 2.4 и получите порядок обновления этой подсистемы и прочих, которые поменялись в 2.4. К тому же 1С поставляет обработку, которая модифицирует код старой версии БСП в объектах, подключенных к БСП при внедрении.

    2. Порядок внедрения БСП изложен в документации https://its.1c.ru/db/bsp244doc/ в картинках и кусках кода для вставки, если делать по шагам, то проблем не возникает.

    Reply
  5. vicmos

    Большое спасибо за помощь!!!!!!!!

    Reply
  6. shumvlesu
    &НаКлиенте
    Процедура Подключаемый_ВыполнитьКоманду(Команда)
    Если Команда.Имя = «ПодменюПечатьОбычное_Реестр» Тогда
    НастройкиДинамическогоСписка();
    КонецЕсли;
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);
    КонецПроцедуры

    У меня ругалось на ВыполнитьКоманду пока не глянул в параметры этой процедуры. Элементы.Список должен содержать поле — Ссылка. Версия БСП — 2.4.2.25

    Reply
  7. Korolev

    Благодарю за публикацию. Пригодилась! 🙂

    Reply
  8. l2qweit

    Огромное человеческое спасибо !!! особенно за.

    В общем модуле УправлениеПечатьюПереопределяемый, в процедуре ПриОпределенииОбъектовСКомандамиПечати нужно добавить свои созданные документы, для которых нужна печать:
    Reply
  9. nipil

    Есть косяк именно в бухгалтерии 3.0.52.*.

    Для подключенных «Дополнительных отчетов и обработок» в «ФормеСписка» для документов пропала кнопка — «Отчеты…».

    Причем в БСП все нормально работает.

    Глубоко не копал. Тестовую конфигурацию вылечил:

    ….»Включить возможность изменения»

    Документы.ПлатежныеПоручения.ФормаСписка

    ГруппаКоманднаяПанель добавил ПодменюПечать.

    Сейчас пытаюсь написать дополнительную обработку которая по кнопке «Печать » восстановит кнопку «Отчеты…». (Опять зубы через задницу лечить…)

    Reply
  10. nipil

    Решил расширением конфигурации.

    Общий модуль — Подключаемые команды

    &После(«ВывестиКоманды»)
    Процедура рПП_ВывестиКоманды(Форма, Команды, ПараметрыРазмещения)
    Если Форма.Имяформы = «Документ.ПлатежноеПоручение.Форма.ФормаСписка» Тогда
    // Сменим родителя ПодменюОтчеты
    ЭлементПодменюОтчеты = Форма.Элементы.Найти(«ПодменюОтчеты»);
    ЭлементГруппаКоманднаяПанель = Форма.Элементы.Найти(«ГруппаКоманднаяПанель»);
    Форма.Элементы.Переместить(ЭлементПодменюОтчеты,ЭлементГруппаКоманднаяПанель);
    КонецЕсли;
    КонецПроцедуры
    

    Показать

    Reply
  11. Dunda

    ОООООООО спасибо огромное! Методом тыка нашла лишние процедуры, теперь по вашей статье попробую до конца доделать

    Reply
  12. Alex_1974

    Присоединяюсь к благодарившим, очень вовремя, просто спасли!!!

    Reply
  13. iiceberg

    Добавлю свои 5 копеек.

    Когда добавляете (переписываете) под БСП 2.4 свои объекты, по мимо действий указанных в статье, по крайней мере для ERP 2.4, необходимо проделать еще несколько манипуляций, что бы вся эта магия от 1С версии 2.4 заработала.

    А конкретно надо сделать следующее:

    Для Добавления команд Отчеты, ввод на основании надо указать БСП, что для этого объекта надо использовать механизм «стандартных подсистем». Делаем следующее:

    — для отчетов: Общий модуль «ВариантыОтчетовПереопределяемый» процедура «ОпределитьОбъектыСКомандамиОтчетов» добавляем свой объект в массив.

    — для Ввода на основании: Общий модуль «СозданиеНаОснованииПереопределяемый» процедура «ПриОпределенииОбъектовСКомандамиСозданияНаОсновании» добавляем свой объект в массив.

    для печати, заполнения и проч. видимо тоже есть процедуры, но я их не искал и не использовал из-за ненадобности (пока еще) =).

    надеюсь сэкономил полчаса работы.

    Reply
  14. agent00mouse

    Обе статьи актуальны, т.к. есть и самописаные конфы, созданные ещё во времена динозавров.

    Reply
  15. Shaldryn

    Статья пригодилась, спасибо, как раз делали переход с КА 2.2 на 2.4

    правда я так понял команда печати для формы регистра сведений это не прокатит, там идет сравнение типов, на этом все и рушится, по старой схеме раньше работало все…

    Reply
  16. serg0776

    т.е. при следующем обновлении эта процедура затрется ПриОпределенииОбъектовСКомандамиПечати

    И так отслеживать это постоянно.

    Reply
  17. serg0776
    Reply
  18. aldan

    (17) Меня тоже это печалит. Уже несколько раз добавлял свои документы после обновления. Не возникло идей, каким образом можно избавиться от редактирования «ПриОпределенииОбъектовСКомандамиПечати» чтобы после обновления не пропадали печатные печатные формы в «своих» документах?

    Reply
  19. kosikov_oleg

    Спасибо! Очень своевременно.

    Reply
  20. user705522_constantin_h

    Спасибо! Хорошая статья.

    Reply
  21. yase

    Спасибо. Добавлю еще неочевидный момент:

    в форме списка в динамическом списке ОБЯЗАТЕЛЬНО должна быть Ссылка (писали выше). Но если ее видимость отключить в пользовательском режиме (или в конфигураторе — не важно), то печать перестает работать.

    Выход: в настройках поля включить флаг «Использовать всегда».

    Вот цитата с итс:

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

    Reply
  22. Saifa

    Вот это да! Сутки промучилась, прежде чем нашла пилюлю… Слов нет. Спасибо вам!

    Reply
  23. sandra

    Спасибо! Я тоже несколько часов убила, пока нашла в чем дело. А надо было сначала статьи от умных людей почитать))

    В итоге от добавления команд печати средствами БСП решила отказаться — перспектива при каждом обновлении восстанавливать затертый код не радует(((

    Reply
  24. arshanskiyav

    Делаю расширение со своим док-ом, из-за этого момента чуть не забросил мысль о расширении.

    Скрытый текст
    Reply
  25. nysysimara

    спасибо за подробное описание

    Reply
  26. demetrius2003

    Что то я не понимаю. Разве никто не наткнулся на нескладушки? Статья нихрена не универсальная! В УТ (11.4.1.273), к примеру, нет УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати!

    КомандаПечати.Обработчик    = «УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати»;

    Не будет работать! Более того, в УправлениеПечатьюУТКлиент нет ничего похожего на ВыполнитьКомандуПечати! Т. е. как быть в случае с УТ вообще непонятно! Не работает эта херня в УТ!

    Reply
  27. ПрестарелыйЗаяц

    У меня все работает, чего там у тебя не работает непонятно. Автору респект.

    Reply
  28. LosevI

    (27) Да, в УТ это не работает, такого общего модул, конечно же, нет.

    А если пользоваться «УправлениеПечатьюКлиент.ВыполнитьКомандуПечати», то выдает уже другую ошибку:

    Обращение к процедуре объекта как к функции (ВыполнитьКомандуПечати)

    Вообщем, как адаптировать для УТ пока не разобрался. У вас нашлось решение?

    Reply
  29. kiyamov

    ЗУП 3.1. Ни в какую не появляется кнопка «Печать» в справочнике «Справки физических лиц». Делаю через расширение. Добавил в ПриОпределенииОбъектовСКомандамиПечати СписокОбъектов.Добавить(Справочники.СправкиФизическихЛиц). Прописал в ПриСозданииНаСервере ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект). Толку нет. Кнопка не пояляется. Что я делаю не так?

    Reply
  30. oksimisis

    Спасибо большущее! Сутки голову ломаю, найти не могла где собака порылась.

    Reply
  31. BadMadJohn

    Спасибо большое. Чутье подсказывало, что где-то теперь нужно указывать документы в которых должны подключаться команды, думал в каком-то регистре сведений. Хорошо что есть гугл, который по запросу «команды печати 1с БСП» вывел прямиком на вашу статью. Не пришлось долго искать.

    Reply
  32. Геннадьевич

    Спасибо. Очень полезно.

    Как сделать добавление под кнопку «Печать» внешних печатных форм добавленных в базу?

    Reply
  33. scarabey2006

    Спасибо, пригодилось, не получилось пока с журналом документов и формой списка, ругается по всякому, буду разбираться

    Reply
  34. natik_82

    Отличная статья! Очень помогла!!!

    Reply
  35. user619273_alevtina

    Спасибо! Во время, очень помогло.

    Reply
  36. user619273_alevtina

    Спасибо! Очень помогли. Очень вовремя увидела вашу статью.

    Reply
  37. demetrius2003

    Апну немного тему! Граждане! Общего описания этого загадошного механизма нет ни у кого? УТ так и не работает данный вариант. Более того! В самой УТ в разных доках реализовано это по разному! И от релиза к релизу ботва эта меняется со скоростью света! Может кто описать процесс? В общих чертах?

    Reply
  38. newvideo

    во всех статьях в сети УправлениеПечатьюБПКлиент

    В УНФ 1.6.5. БСП 2.3.1.53

    в модуле УправлениеПечатьюСлужебныйКлиент

    в процедуре ВыполнитьПодключаемуюКомандуПечатиПодготовкаОбъектовПечати

    вываливается:

    {ОбщийМодуль.УправлениеПечатьюСлужебныйКлиент.Модуль(125)}: Ошибка компиляции при вычислении выражения или выполнении фрагмента кода Результат = Вычислить(Обработчик);

    по причине:

    {(1,1)}: Переменная не определена (УправлениеПечатьюБПКлиент)

    <<?>>УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати(ОписаниеКоманды)

    Менял в Модуле Менеджера Документа

    УправлениеПечатьюБПКлиент на УправлениеПечатьюКлиент и также на

    Подключаемый_ВыполнитьКомандуПечати

    всёравно ошибки, куда же копать?

    БПКлиент только в Бух и работает, кто-нибудь нашел решение для других конфигураций?

    Reply
  39. newvideo

    Уточню в УНФ 1.6.5. БСП 2.3.2.53

    Глянул в отладчике какой параметр у КомандаПечати.Обработчик в стандартной печати, оказывается никакого нет.

    Поэтому указал КомандаПечати.Обработчик = «»;

    Заработало

    Reply
  40. selez-a

    Спасибо автору. Сэкономил уйму времени.

    Reply
  41. Sergynia

    Спасибо за статью.

    Reply
  42. TimoninD

    (29) Если убрать обработчик «КомандаПечати.Обработчик = «УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати» »

    , то в УТ все будет работать.

    Reply
  43. Alani

    Благодарю!!! Тоже намучилась с этой кнопкой печати при обновлении. «3. И то, чего нет в указанной статье:» помогло, поскольку остальное я уже на сто раз проверила.

    Reply
  44. MikeI

    (18) Класс — это очень емко. У меня только не цензурная лексика.

    Reply

Leave a Comment

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