КАК загрузить(сохранить) картинки из документа EXCEL или WORD (MS OFFICE.)




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

39 Comments

  1. Tatitutu

    Думаю кому нибудь , когда нибудь пригодится и сохранит пару минут, часов…а может и седых волос.

    Reply
  2. Ёпрст

    >>>Хотел сразу же здесь ответ написать, нет не буду

    >>>Ответ в прикрепленном файле

    Какое то противоречие..

    ЗЫ: А нафига это всё ?

    Reply
  3. awa

    Тупая накрутка количества скачиваний. Минус за форму подачи материала.

    Reply
  4. Tatitutu

    (2) ну не успела правильно страница отобразиться

    хотел в виде конкурса оформить на лучшее решение вопроса

    не успел…

    (3) …

    Тупая накрутка количества скачиваний

    Сказал бы я тебе… да тут Женщины есть.

    файл выложил запореленный не для скачки -( это статья, а не программа )

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

    а не потом я его придумал.

    И увидеть интерес к данному вопросу (для статистики)

    А так , сейчас такИе типа тебя будут писать — да это баян,яйца выеденного не стоит… (посмотрел твои статьи — без комментариев)

    а я могу поспорить что многим этот совет пригодится и не все про этот способ знают.

    ….

    Минус за форму подачи материала

    Вот так — хотел новую струю внести — типа конкурса — НЕНУЖНО

    пользователь ленивый , он не будет, он не … а что мы их судим

    тут ненужно быть программистом , нужно только знать как пользоваться инструментом.

    А главное научить, показать и рассказать — а чтобы лучше запомнилось — заставить подумать.

    Reply
  5. Ёпрст

    Гы.. ну вот тебе еще баян:

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

    Для 2007 офиса, еще проще — *.docx на *.zip (или просто открыть файло в архиваторе)

    и распаковать — всё видно, при желании, изменить и запаковать обратно.

    ЗЫ: таким способом, например, можно тупо снять любой пароль/защиту к книге..

    Reply
  6. Tatitutu

    (5) )))) Уважаемый Ёпрст, то что Вы это знаете я нисколько не сомневался (и статейка эта не для Вашего уровня)

    Это как ложка с дыркой — проверка на вшивость.

    Вчера задал такой вопрос на собеседовании — у паренька судя по резюме три года опыта программирования на всем — вот он с задачей не справился.

    «А вопрос стоял так вот тебе файл в нем 6 картинок — мне нужно их увидеть в 1С на форме»….Финиш, он мне через 2 часа начал доказывать, что в 1С такой функции нет и значит это НЕДОКУМЕНТИРОВАННАЯ возможность.

    «На баяне сможет клавиши нажать каждый , а вот сыграть не нем — дано не каждому»

    Reply
  7. awa

    (4) Сколько пафоса…

    Убрал свой минус в связи со сделанными исправлениями в статье.

    Reply
  8. DoctorRoza

    Плюсану за отстаивание своих интересов! 😉 Подчерпнул для себя новую информацию! Благодарю! 🙂

    Reply
  9. Spartan

    (6) Это задание скорее на смекалку, а не на знание возможностей системы и встроенного языка. 😉 Поэтому над претендентом ты явно прикололся… 😀

    Reply
  10. nafa

    Файл, сохранить, веб-страница, пути какие-то… Это же сколько кнопок нажимать надо 🙁 . Не мудрено перепутать.

    Я лично в таких случаях делаю чисто по деревенски: в ворде — копировать, там, где картинка нужна — вставить.

    А если монитор достатчно большой, чтобы можно было разместить рядом ворд и 1С то просто перетаскиваем мышкой из ворда на 1Совскую табаличку…. 😉

    Reply
  11. Tatitutu

    (10)

    Я лично в таких случаях делаю чисто по деревенски: в ворде — копировать, там, где картинка нужна — вставить.

    Я уважаю твой выбор, если тебя так устраивает — то почему бы и нет.

    можно и так, но долгоооооо очень , если в прайсе больше 100 картинок

    будешь каждую копировать ?

    А вставлять куда будешь ?

    (ну нет там у рисунка в свойствах сохранить как…)

    скопировать можно, а как в файл превратить 🙂

    Reply
  12. spbpavlov

    (0)

    Видел написанные макросы для выгрузки на много много строк.

    не через html, макросом можно сохранить картинку ~5 строк кода, это много?

    Reply
  13. nafa

    (11) А мы что обсуждаем то? Как из экселя выдернуть картинку выдернуть

    ну нет там у рисунка в свойствах сохранить как…

    или как в 1С вставить?

    Чтобы из экселя выдернуть, метод годится. Вставить можно в любую программу, поддерживающую вставку из клипбоарда, в т.ч. на табличный документ в 1С в 7.7. В 8ку надо подумать.

    А если речь идет о вставке картинок с программной привязкой к номенклатуре, то — принципиальной разницы с макросом, читающим картинки прямо со страники нет — все равно программу писать надо по выборке файлов и записи их (или хотя бы их путей) в БД. Встроенной функции ПрочитатьМногоКартинокИСамостоятельноПривязатьИхКНоменклатур­е вроде даже в 8.2 нет.

    Reply
  14. nafa

    А вообще универсальный способ выдергивания рисунков — кнопочка PrtScr. Есть также специальные программы которые сами копируют определенную область экрана, выполняют прокрутку и так далее (полезно при работе со всякими замороченными форматами типа PDF)

    Reply
  15. script

    А мне понравилось! Поставлю +

    Хотя думаю если бы задача такая возникла то я до этого допер бы.

    Reply
  16. Tatitutu

    (12) Мне про макросы не нужно рассказывать 😀

    Сможете за свои слова ответить

    макрос в 5 строк — листинг выложить здесь ?

    (не все знаю что такое макрос и как его написать)

    (14) нет слов…в шапке написано

    «на мой взляд самый ПРОСТОЙ и самый БЫСТРЫЙ способ … (не требующих особых навыков)» я показал вариант ! а не доказал что это Единственный и неповторимый способ.

    Чем больше способов мы знаем, тем мы универсальнее )))

    Reply
  17. spbpavlov

    (16)

    пример можно найти в интернете.

    я могу и здесь написать, но так не интересно будет. тем более что вам про макросы не нужно рассказывать 😀 можно на что нибудь поспорить, если не верите. 😉

    Reply
  18. nafa

    (16) Так все-таки «загрузить» или «сохранить»? Сие разные вещи. Сохранить таким способом действительно быстро и удобно. А вот если надо «загрузить» (я так понимаю, что в какое-то еще приложение, например в 1С), то уже надо смотреть, в какое приложение, все/выборочно и т.п. Причем если речь идет об автоматической привязке к номенклатуре, то пока картинки лежат на листе (т.е. считываются макросом), их положение относительно ячейки с названием товара опеределяется на мой взгляд попроще, чем положение картинки относительно текста в создаваемом ХТМЛ файле.

    Reply
  19. ACE$

    а я, почему-то, считал это само собой разумеющимся…

    то же самое касается всего офисного пакета от МС

    Reply
  20. Tatitutu

    (18)

    их положение относительно ячейки с названием товаре опеределяется на мой взгляд попроще

    — порадовало.

    Проще не куда, если учесть то что картинка непривязывается к ячейке и хорошо если у нее есть правильное имя.

    (17) найдите если не трудно, я готов поспорить с Вами

    за каждый лишний символ проигравший платит — с Вас размер суммы и вперед

    Reply
  21. nafa

    (20)

    картинка непривязывается к ячейке

    В ХТМЛе может и не привязывается, а вот на листе очень даже привязывается. Свойства TopLeftCell — ячейка, в которой нходится верхний левый угол, BottomRightCell — правый нижний.

    А вообще наверное кто к чему привык. Кто с VBA дружит — тому макросами удобнее, кто с ХТМЛ — соответственно из файла читать. Всяк кулик свое болото хвалит.

    Reply
  22. s_a_r_u_m_a_n

    (0) таким же образом автоматом генерятся письма в аутлуке и складываются в исходящие )) идея хороша

    Reply
  23. Арчибальд
    Чем больше способов мы знаем, тем мы универсальнее )))

    И этим все сказано 😎

    Reply
  24. nafa

    Да, еще, когда длину необходимого кода обсуждаем, то надо тоже поаккуратнее с терминами. 5 операторов (команд?), т.е. того, что отделяется друг от друга символом «;», может и не хватит, а вот 5 строк (т.е. того, что отделяется друг от друга нажатием клавиши»Ентер») с учетом того, что в каждую строку можно помещать несколько операторов 🙂 хватит вполне.

    Reply
  25. Tatitutu

    (24) Заблудились ? Ветку попутали 🙂

    Reply
  26. spbpavlov

    (20)

    за каждый лишний символ проигравший платит

    не понял, что считать лишним символом?

    (24) речь идет о 5 операторах, этого достаточно чтобы сохранить картинку. 7 — сохранит более красиво.

    Reply
  27. Tatitutu

    (26) Условие задачи:

    написать макрос — который «ведернет» ВСЕ доступные картинки из книги EXCEL и сохранит их на диске.

    можно оценить по скорости, оригинальности, по правильности кода, универсальности…и.т.д.

    я предложил — главное условие чтобы работало согласно условия. И у кого будет меньше

    символов кода

    Sub ВыдергиваемКартинки()

    с…

    по.

    End Sub

    тот и победил !

    Reply
  28. nafa

    (24) Нет, не перепутал

    (26) (27) Просто сохранить, как правильно и написано в статье — это 1 оператор Save c указанием формата «HTML с картинками».

    А сравнивать надо не сохранить, а полную обработку загрузки из Экселя в 1С — т.е. найти первый товар в прайсе, найти его в номенклатуре в 1С, если нет — создать, эту номенклатуру, найти соответствующую ей картинку и привязать к номенклатуре, перейти к следующему товару.

    Reply
  29. spbpavlov

    (27) если не через сохранение в html то ок, иначе это одна строка:

    ActiveWorkbook.ActiveSheet.SaveAs «C:Test.htm», xlHtml

    и сохранить нужно например в jpeg

    Reply
  30. nafa

    А вообще метод классный. Очень удобен когда файлы, из которых надо импортировать данные, несистематизированы. Только не надо ничего никуда не сохранять. Делаем в 1С на форме поле ХТМЛ документа, включаем режим редактирования. В экселе — выделить все, копировать, в 1С — вставить. Все. Текст — доступен, все картиночки аккуратно сложены в LocalSettingsTemp, пути к картинкам в файле есть, левый верхний угол картинок к ячейкам подвязан.

    Копировать, разумеется, можно не только из офиса, но и вообще из любого источника, поддерживающего ХТМЛ в буфере обмена (из почты, с веб-страницы и т.п.)

    Reply
  31. gavlexx

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

    Приведенная функция получает в качестве аргумента полный путь к книге Excel со встроенной картинкой (имя листа с картинкой должно быть «Лист1») и возвращает объект 1С — Картинка.

    Функция ИзвлечьКартинкуИзXLS(ФайлXLS)
    
    ИмяВременногоФайлаКартинки = КаталогВременныхФайлов() + «tempPict.gif»;
    
    // для открытия документа
    Док = Новый COMОбъект(«Excel.Application»);
    Док.DisplayAlerts = False;
    
    // для промежуточного хранения картинки
    Excel = Новый COMОбъект(«Excel.Application»);
    Excel.DisplayAlerts = False; //Закрытие не должно вызывать диалога сохранения
    
    
    Состояние(«Попытка установки COM-соединения…»);
    
    Попытка
    Док.Workbooks.Open(ФайлXLS);
    Исключение
    Сообщить(«Не удалось открыть файл!»);
    Возврат Неопределено;
    КонецПопытки;
    
    //Извлечение картинки
    Если Док.Sheets(«Лист1»).Pictures.Count() > 0 Тогда
    
    //Ссылка на картинку
    Картинка = Док.Sheets(«Лист1»).Pictures(1);
    
    // промежуточная книга для хранения диаграммы — контейнера картинки
    Excel.Application.Workbooks.Add(1);
    ИмяЛистаXLS = Excel.ActiveSheet.Name;
    
    //Создание диаграммы, которая будет являться контейнером для картинки
    //Расположение новой диаграммы — как объект на созданном ранее новом листе, являющемся в данный момент активным
    //Размеры диаграммы слегка превышают размер картинки
    ДиаграммаXLS = Excel.ActiveSheet.ChartObjects().Add(0, 0, Картинка.Width * 1.01, Картинка.Height * 1.01);
    
    //Копирование картинки в буфер
    Картинка.Copy();
    
    //Заполняем диаграмму картинкой из буфера
    ДиаграммаXLS.Chart.Paste();
    
    //Сохраняем диаграмму во временном файле
    ДиаграммаXLS.Chart.Export(ИмяВременногоФайлаКартинки);
    
    ДиаграммаXLS = Неопределено;
    
    //Загружаем картинку из временного файла в объект Картинка
    КартинкаОбъект = Новый Картинка(ИмяВременногоФайлаКартинки);
    
    //Удаляем временный файл
    Попытка
    УдалитьФайлы(ИмяВременногоФайлаКартинки);
    Исключение
    КонецПопытки;
    
    КонецЕсли;
    
    //Док.Application.Quit();
    Док.Workbooks.Close();
    
    //Книгу, использовавшуюся для импорта картинок закрываем
    Попытка
    Excel.Application.Quit();
    Док.Application.Quit();
    Исключение
    КонецПопытки;
    
    Возврат КартинкаОбъект;
    
    КонецФункции

    Показать

    Reply
  32. gavlexx

    (27)

    Интересно, как макросом можно сохранить картинку на диске? 😮

    У объекта Картинка Excel нет метода, позволяющего сохранить картинку на диск, только скопировать в буфер обмена…

    Reply
  33. Batchir

    (30) 😀 nafa выиграл. Самый универсальный способ — простой КопиПаст, 0 строчек кода.

    Reply
  34. Abadonna

    (0) Юра, http://infostart.ru/public/59436/#postform 😉

    пост 153

    Reply
  35. Abadonna

    (32)

    Интересно, как макросом можно сохранить картинку на диске?

    Вот так, например:

    Option Explicit
    Private Declare Function OpenClipboard Lib «user32.dll» (ByVal hwnd As Long) As Long
    Private Declare Function CloseClipboard Lib «user32.dll» () As Long
    Public Declare Function EmptyClipboard Lib «user32» () As Long
    Private Declare Function GetClipboardData Lib «user32.dll» (ByVal wFormat As Long) As Long
    Private Declare Function CopyEnhMetaFile Lib «gdi32» Alias «CopyEnhMetaFileA» (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
    Const CF_ENHMETAFILE As Long = 14
    
    
    Sub GetPictures()
    Dim PShape As Shape, hStrPtr As Long
    For Each PShape In ActiveSheet.Shapes
    If PShape.Type = msoPicture Then
    PShape.CopyPicture
    If Not CBool(OpenClipboard(0&)) Then
    MsgBox «Не удалось открыть буфер»
    GoTo NextSh
    End If
    hStrPtr = GetClipboardData(CF_ENHMETAFILE)
    If Not CBool(hStrPtr) Then
    MsgBox «Не удалось получить дескриптор»
    GoTo CloseClip
    End If
    If Not CBool(CopyEnhMetaFile(hStrPtr, «C:TestPictures» & «Picture » & hStrPtr & «.jpg»)) Then
    MsgBox «Не удалось создать файл»
    GoTo CloseClip
    End If
    CloseClip:
    CloseClipboard
    NextSh:
    End If
    Next
    ‘очистка буфера обмена
    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard
    MsgBox «Картинки сохранены», 64, «Конец»
    End Sub
    
    

    Показать

    P.S. Не мой пример, нагуглил

    P.S.S Каталог C:TestPictures сначала создайте на диске

    Reply
  36. Parazyte

    Согласен, что если картинка одна в документе, то проще всего Копи -> MS Paint (или) любой др. графический редактор, а оттуда сохраняй в любой желаемый формат, попутно отредактировав изображение при необходимости.

    Reply
  37. Cvetic

    Tatitutu, спасибо, мне пригодилось 🙂

    Reply
  38. nataliagns

    Добрый день! Спасибо за статью, отличный способ. Только вот.. Можно как-то сделать, чтобы изображениям присваивалось скажем имя из той же ячейки, где они стоят?

    Reply
  39. Harmful

    думаю пдф также

    Функция ПрочитатьКартинку_MSEXCEL(Знач EXCELApplication, Знач Sheet, Знач НомерКолонки, Знач НомерСтроки, Знач ИмяФайлаEXCEL, Знач НомерЛиста, Знач ПравилоИмяФайлаКартинки = «УИД»)
    Перем GraphicObject, Chart;
    Перем ПолноеИмяФК, ФайлКартинки;
    
    Если Sheet.Shapes.Count() = 0 Тогда
    Возврат Неопределено;
    КонецЕсли;
    
    Для Каждого GraphicObject ИЗ Sheet.Shapes Цикл
    Если GraphicObject.Type = 13 И GraphicObject.TopLeftCell.Column = НомерКолонки И GraphicObject.TopLeftCell.Row = НомерСтроки Тогда
    
    // GraphicObject.Name.
    Если ПравилоИмяФайлаКартинки = «УИД» Тогда
    ПолноеИмяФК = КаталогВременныхФайлов() + Новый УникальныйИдентификатор() + «.jpg»;
    Иначе
    ПолноеИмяФК = КаталогВременныхФайлов() + ИмяФайлаEXCEL + «Л» + НомерЛиста + «С» + НомерСтроки + «К» + НомерКолонки + «.jpg»;
    КонецЕсли;
    
    Попытка
    GraphicObject.ScaleHeight(1,1);     // Истинный размер по высоте.
    GraphicObject.ScaleWidth(1,1);      // Истинный размер по ширине.
    GraphicObject.Copy();
    
    Chart = EXCELApplication.ActiveSheet.ChartObjects().Add(0, 0, GraphicObject.Width, GraphicObject.Height).Chart();
    Chart.Paste();
    Chart.Export(ПолноеИмяФК);
    
    Chart = Неопределено;
    
    ФайлКартинки = Новый Файл(ПолноеИмяФК);
    Если ФайлКартинки.Существует() Тогда
    Возврат ПолноеИмяФК;
    Иначе
    Сообщить(«Не удалось экспортировать картинку из строки » + НомерСтроки + » колонки » + НомерКолонки + » в » + ПолноеИмяФК);
    Возврат Неопределено;
    КонецЕсли;
    Исключение
    Сообщить(ОписаниеОшибки());
    Сообщить(«Не удалось экспортировать картинку из строки » + НомерСтроки + » колонки » + НомерКолонки + » в » + ПолноеИмяФК);
    Возврат Неопределено;
    КонецПопытки;
    
    КонецЕсли;
    КонецЦикла;
    
    Возврат Неопределено;
    КонецФункции
    

    Показать

    Reply

Leave a Comment

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