Баг или фича? Неожиданное поведение платформы




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

88 Comments

  1. comol

    Зачотная статья. Must read. Автору респект. Некоторые «особенности» стали новостью. Тема с датами просто феерична 🙂

    Reply
  2. Dementor

    Спасибо, интересная подборка.

    Из похожего могу только вспомнить падение тонкого клиента при открытии формы с условным оформлением, где используются переименованные/удаленные реквизиты. Уже прямо условный рефлекс — каждый раз когда мне говорят про падение при заходе лишь на определенную форму, которую не «лечит» чистка кеша (передобавление базы), то уже каждый раз сразу проверяю именно условное оформления самой формы и ее динамических списков.

    Reply
  3. TrinitronOTV

    Спасибо, весьма познавательно было

    Reply
  4. YPermitin

    (1) спасибо! 🙂

    Reply
  5. YPermitin

    (2) интересно, надо попробовать воспроизвести.

    Reply
  6. Casey1984

    Про точность чисел в запросе: это не баг это фича 😉 Косвенно тут https://its.1c.ru/db/metod8dev#content:2665:hdoc и тут https://its.1c.ru/db/v8std#content:2149184184:hdoc

    Reply
  7. Casey1984

    Про отсутствие субконто: такая же фигня бывает если при переносе данных с использованием КД 2 не все субконто передать.

    Reply
  8. YPermitin

    (7) да, с обменами очень интересное происходит.

    В том числе и с типовыми 🙂

    Reply
  9. Dach

    В копилку:

    А) Выполнение вот такого запроса:

    ВЫБРАТЬ
    ТЗ.Номенклатура КАК Номенклатура,
    Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры
    ПОМЕСТИТЬ ВТ
    ИЗ
    &ТЗ КАК ТЗ
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
    ПО ТЗ.Номенклатура = Номенклатура.Ссылка

    вызовет вполне ожидаемую ошибку, так как явный джойн к ТЗ, передаваемой в ВТ — запрещен

    Б) А выполнение вот такого запроса:

    ВЫБРАТЬ
    ТЗ.Номенклатура КАК Номенклатура,
    ВЫРАЗИТЬ(ТЗ.Номенклатура КАК Справочник.Номенклатура).ВидНоменклатуры КАК ВидНоменклатуры
    ПОМЕСТИТЬ ВТ
    ИЗ
    &ТЗ КАК ТЗ

    никаких ошибок при выполнении не вызовет, но в поле ВидНоменклатуры платформа вернет «битую» ссылку вида «объект не найден», так как джойна к физической таблице справочника «Номенклатура» по прежнему не будет.

    Reply
  10. YPermitin

    (9) интересные фичи! Спасибо.

    Reply
  11. Dach

    (10) вот еще прикольчик:

    Обычные формы, 2 списка (именно табличное поле списка, а не табличное поле таблицы значений) — сверху список конкретного документа, снизу — список табличной части этого документа. Реализовано довольно часто встречающееся поведение: при активации строки верхнего списка — в нижнем отображается связанная информация, в данном случае табличная часть.

    Связь между списками организована так:

    ЭлементыФормы.ДокументСписок.ТекущиеДанные.Товары

    где ДокументСписок — наш верхний список

    то есть, указанная строка связи прописана у нижнего списка в поле «Данные»

    Так вот, казалось бы — все хорошо, все работает и все сделано штатным способом.

    Но! Как только пользователь откроет такую форму и начнет в ней искать поиском по строке (не отбором, а именно поиском, что юзеры очень любят делать на обычных формах) или к примеру попробует такой список отсортировать по возрастанию по колонке «Номер» — что произойдет? Сеанс клиента начнет дичайшим образом тормозить. На СУБД возникает нагрузка. Фактически запросы в цикле — по каждой строке документа начинается получение табличной части. То есть то, что должно выполняться только при активации строки — выполняется не только лишь при ней, а мало когда (ВСЕГДА) вообще ))))



    Далее клиентский сеанс зависает, пользователь завершает его через диспетчер. Но, в консоли он по прежнему висит и даже если там его «убить» — соединение остается. И что самое «прикольное» — растет папка temp на сервере приложений, связанная с учетной записью службы. В ней появляется файл v8_blablabla.tmp, который растет примерно на 25-30 Мб в секунду. Причем, сколько сеансов «положили» таким образом форму — столько и будет файлов. Читать и копировать файл нельзя, так как его держит рпхост. Пока руками не убить этот рпхост, на котором был проблемный сеанс — файл не исчезнет.

    Reply
  12. YPermitin

    (11) Парам парам пам, тунц!

    Это прямо невообразимо 🙂

    Reply
  13. Dach

    (12) не представляете, какое масштабное расследование пришлось провести, чтобы это все выяснить. Увидеть гигантский файл, найти рпхост, который пишет в этот файл. Посмотреть сеансы, которые на этом рпхост, примерно прикинуть — чей же сеанс мог вызывать такое поведение (причем, кстати, сам рпхост память не расходовал). Найти этот сеанс, позвонить юзеру с вопросами «что же ты там делаешь, мил человек», юзер говорит «да ничего такого, сижу работаю, документы смотрю, кнопки жму»…. Ну и т.д. Почти 2 недели разбирались…

    Так что, может кому пригодится )))

    Reply
  14. YPermitin

    (13) что-то подобное было в практике. Пользователи иногда запускали тяжелый отчет и…забывпли указывать отборы адекватные.

    В итоге увеличивался размер сеансовых данных в каталоге сервера «sncctx*» до 100 ГБ и выше.

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

    Но изначально проблема звучала как «Закончилось место на диске».

    Reply
  15. the1

    Изредка при отладке по шагам видно, что выполняется какой-то другой код. Ну то есть отладка шагает по модулю, но как-то странно, рывками и скачками, и вычисление переменных результата не дает (переменная не определена). Так вот — это выполняется код из кэша. Базу обновили, а программный кэш остался старый. Пару раз сталкивался, и по-моему это ни фига не фича.

    Reply
  16. YPermitin

    (15) спасибо.

    Да тоже сталкивался в разных вариациях. Иногда было очень больно 🙂

    Reply
  17. Rustig

    (11) специально для проверки создал видео — включил в свою публикацию — https://infostart.ru/public/933060/

    база файловая — работа со списком происходит быстро и без ошибок

    конечно, сталкивался с тем, что в при использовании remote app 1с — переставали работать разделители на форме — форма открывалась криво — приходилось убирать разделители вовсе; при работе в локальной сети в файловой базе, начиная с 5 человек начинаются еле заметные подвисания формы списка (несущественные), при увеличении кол-ва пользователей одновременной работы с реализациями — форма подтормаживает — но это известная проблема блокировок файловой базы — решения есть — переходить на терминальный сервер или СУБД.

    Reply
  18. YPermitin

    (17)

    файловая — работа со списком происходит быстро и без ошибок

    Может тут комбинация — поведение платформы + код в обработчиках. Но это не точно.

    Reply
  19. Dach

    (18)

    Нет-нет, друзья. Никакого кода, никаких обработчиков. Дело именно в ЭлементыФормы.ДокументСписок.ТекущиеДанные.Товары

    Еще раз: база в клиент-серверном режиме, количество документов — более 200 тыс. Открывается форма, без отборов и без ограничения по периоду, пользователь сортирует по номеру. Спустя 20 минут появляется файл в папке temp, растет очень быстро. На субд бесконечные запросы вида: «select … from VTTabDoc where id_ref = &id_ref»

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

    Reply
  20. YPermitin

    (19) принято)))

    Reply
  21. oleg-x

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

    1)Связан с кэшем и суть такова, можно написать какой то код. Вроде все работает. А через какое то время открываешь конфигуратор а там, как будто ничего не изменено. При то что, можно вносить изменения несколько раз, а там чистота. Может отрабатывать старый код, а может новый. Помогает либо просто закрыть конфигуратор и открыть, либо чистка кэша.

    2) Более интересный случай, не встречал на просторах интернета такого. Суть такова, добавляется в конфигуратор реквизит, все хорошо, работаем и база заполняется. Но через какое то время, раз и нет этого реквизита и кода, который его заполняет. Хотя он был и через клиентское приложение видно было. Такая ситуация повторилась 2-3 раза, во всех случаях общее одно, пропадали куски кода и реквизиты, которые недавно добавили. Чистка кэша пользователя, перезагрузки сервера и прочее не помогало. Но подсказали про такую вещь как кэш сервера 1С, опять же, поиском такую информацию не найти было тогда, подсказали ссылку, но в итоге после чистки, все стало хорошо, магия пропала.

    Reply
  22. SerVer1C

    С миллисекундами в датах столкнулся, когда записывал данные через ADO в скуль. Могу ошибаться, но раньше дата хранилась в MS SQL как тип datetime, где возможно было указывать миллисекунды, а с какой-то версии платформы дата стала храниться как datetime2(0), и тут уже дробные части секунды невозможно указать.

    Reply
  23. YPermitin

    (21) подтверждаю. Такая магия тоже была, помогла очистка сеансовых данных на сервере, которые еще называют кэшем.

    Reply
  24. Darklight

    Считается фичей следующая проблема (но она нигде не документирована):

    Алгоритмы, размещённые Клиентском глобальный общем модуле — не видят алгоритмы, размещённые в модуле приложения (соотвествуюещего клиентского контекста: обычный/управляемый/внешнее соединение).

    То есть, например, из глобального общего модуля с флагом «Клиент (управляемое приложение)» нельзя обратиться к экспортным функция и переменным «Модуля управляемого приложения» — будет ошибка на стадии сохранения/проверки синтаксиса (для модулей внешнего соединения — будет ошибка на стадии создания подключения) — что, не вижу данных элементов, к которым идёт обращение. Если проигнорировать ошибку проверки конфигурации — то она всё-равно выскачет в runtime — при компиляции такого общего модуля.

    Но!

    Если выполнить обращение к содержимому модуля приложения через посредник — не глобальный общий модуль того же контекста (в для приведённого выше пример — через какую-то экспортную функцию неглобального общего модуля с флагом «Клиент (управляемое приложение)»), то никаких ошибок не будет — такой вызов будет корректно работать! То есть, технической проблемы недоступности контекста нет — это просто завышенное требование синтаксической проверки.

    Говорят, это ограничение введено из-за того, что глобальные модули компилируются и инициализируются раньше, чем модули приложений, и поэтому, из них нельзя обратиться к ещё не инициализированному модулю приложений. Но реально — это невозможно так сделать, т.к. у общих модулей нет программной секции инициализации, где можно было бы выполнить свой алгоритм — для клиентского контекста первым таки местом как раз будет секция инициализации модуля приложения (внешнего соединения). То есть, обратиться к клиентскому глобальному модуль ранее, чем будет инициализирован модуль приложения — никак нельзя! Так что, данное ограничение — избыточно и нигде не документировано!

    Столкнулся с этим, когда разместил в клиентском управляемом глобальном общем модуле периодический обработчик ожидания (а глобальный обработчик ожидания можно разместить только там или в модуле приложения) и из него не смог обратиться к переменной модуля управляемого приложения (а глобальные переменные, доступные в клиентском контексте для управляемого приложения могут быть только там).

    Обошёл выносом алгоритма обработчика ожидания в клиентский неглобальный общий модуль — в глобальном оставил только переадресацию вызова на неглобальный общий модуль.

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

    Reply
  25. AlexZhukov

    (21)

    1 пункт бывает часто при динамическом обновлении конфигурации.

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

    Reply
  26. oleg-x

    (25) В данном случае там не только динамическое обновление, так как делалось это на тестовой базе (клиент-сервер), в которой всего один пользователь работал и ни каких динамических обновлений не делалось.

    Reply
  27. oleg-x

    Кстати, такие траблы не только с конифгурацие были, но и с внешними обработками в процессе разработки. Приходилось её закрывать, конфигуратор закрывать и заного все открывать.

    Reply
  28. SlavaKron

    Платформа 8.3.14.1565. Управляемые формы.

    На основной форме внешней обработки при нажатии кнопки выбора поля ввода программно вызывается другая форма, подчинённая этому полю.

    В открывшейся форме выбираем (двойным кликом) строку дерева значений. В событии «Выбор» таблицы происходит оповещение владельца формы о выборе.

    После выхода из события «Выбор» приложение закрывается с ошибкой.

    Если выбор строки делать нажатием кнопки Enter, ошибка не происходит.

    Reply
  29. YPermitin

    (24)

    но из-за того, что глобальные модули компилируются и инициализируются раньше, чем модули приложений, и поэтому, из ни

    Очень интересно. На практике не сталкивался, но объяснение выглядит логичным.

    Reply
  30. YPermitin

    (28) Вы уже свежие версии платформы пробуйте? 🙂

    Reply
  31. YPermitin

    Вложение с примерами сделано бесплатным, стартмани для скачивания не нужны.

    Если кому-нибудь нужно 🙂

    Reply
  32. Гость

    (31) Как удалось сделать вложение бесплатным? Раньше интересовался в поддержке, сказали, что такое возможно только для платных публикаций.

    Reply
  33. acanta

    Спасибо. Кто-нибудь сможет погонять эти примеры на постгри и файловых базах и отписаться о результатах.

    Reply
  34. the1

    (32) Надо к модератору обратиться

    Reply
  35. tmn72.1C

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

    Reply
  36. w.r.

    Ну а что поделаешь? Думаю, будут править. Хотя довольно сложно будет, учитывая 4 официально поддерживаемые СУБД (MS, PG, DB2 и Oracle), каждая из которых в отельных случаях ведет себя по своему

    Reply
  37. YPermitin

    (33)

    огонят

    1. Отличная математика — актуально для файловых и клиент-серверных баз (смотрел только под SQL Server). Может на PostgreSQL что-то по другому.

    2. Дата с миллисекундами — для всех баз и СУБД

    3. Регистр не имеет значения — для всех баз и СУБД

    4. Невидимая команда — для всех баз и СУБД

    5. Рекурсивный беспредел — для всех баз и СУБД

    6. Внезапная пропажа колонок — для всех баз и СУБД

    7. Индексированный ад — для всех баз и СУБД

    8. NULL или Неопределено или ПустаяСсылка — для всех баз и СУБД

    Проверить все это дело еще и на Linux не предлагать 🙂

    Reply
  38. acanta

    (36) теоретически 5 субд (файловая 1с + 4 сторонних). Практически — 3 (файловая, MS и PG). К сожалению, это предел возможности управления.

    Reply
  39. YPermitin

    (38) а DB2 еще жива?

    Мне думается что ее уже почти нет в проде.

    Reply
  40. oleg-x

    (39) Говорят жива, ходят слухи, что 8.4….. не пустили в релиз именно из за этой DB2, что то не срослось.

    Reply
  41. SlavaKron

    (30) Да, было бы интересно узнать повторяется ли ошибка на 8.3.13.

    Reply
  42. w.r.

    (39)

    Сейчас в типовой конфигурации смотрю в сторону DB2 Express-C 11. Ведёт себя очень достойно. Даже с ограничениями на 2 ядра и 16 Гб памяти работает где-то даже быстрее Postgres с 12 ядрами и 32 Гб оперативки — быстрее листаются большие динамические списки и делается проведение документов. Заметил для себя пару минусов — довольно непросто по сравнению с Postgres администрировать и долго загружается DT > 10 Гб. Но это для меня не критично

    Reply
  43. oleg-x

    (39)А если хорошо подумать, то 1С 77 живет себе и многих устраивает. И даже конфигурации до сих пор есть на поддержке.

    То что работает, не зачем менять 🙂

    Reply
  44. lunjio

    (15)

    Пару раз сталкивался, и по-моему это ни фига не фича.

    Стабильно раз в 3 — 4 месяца прослеживается, если кэш не чистить и производить динамические обновления или работать во время динамики, иногда раз в пол года, как попался один раз так, при обновлении конфигурации один модуль подтянулся старый, после каждые 2-3 ручками чистю кэш, уже на привычке. Причем разнобразные встречал вариации, иногда у пользователя вообще фигню всякую и ошибки выдает, а самое опасное это когда что-то у кого-то старое и ты даже об этом не знаешь ) Для этого есть всякие чистилки кэша при входе в домен и т.п.

    Reply
  45. Octopus

    (37)

    1. Отличная математика — актуально для файловых и клиент-серверных баз (смотрел только под SQL Server). Может на PostgreSQL что-то по другому.

    На PostgreSQL 9.2.4 в точности такое же поведение. Те же 37 знаков

    Reply
  46. YPermitin

    (45)

    Те же 37 з

    Ок, спасибо за информацию.

    Reply
  47. 3vs

    Не пора ли уже бить линейкой по пальцам одноэсовских программистов?

    Reply
  48. Octopus

    (47) Эффективно бить получается только рублем. Но не в случае фактической монополии

    Reply
  49. Painted

    У меня при каждом обновлении показывает изменения в основной конфигурации, которые мы не делали.

    Я ставлю галочку для безусловного обновления, но в следующий раз снова рисуется карандашик «изменен» слева.

    Reply
  50. YPermitin

    (49) о да. Пытался с этим бороться, даже побеждал иногда, но различия все равно появляются при обновлении.

    В итоге «забил», смирился, простил и живу дальше.

    Если у кого-то есть решение данной проблемы, но поделитесь 🙂

    Reply
  51. gubanoff

    (0)

    Особенности заполнения субконто регистра бухгалтерии на ИТС

    В этой статье как раз написано, что нужно указывать пустую ссылку вместо Неопределено, читаем:

    Чтобы обеспечить единообразное представление «пустых» субконто в базе, необходимо в качестве значения субконто ссылочного типа (например, СправочникСсылка.Контрагенты, ДокументСсылка.ПриходнаяНакладная и т.д.) записывать пустую ссылку.

    Поэтому разработчики типовых перестарались. Может для составного типа Неопределено и хорошо, но для обычного типа нужна пустая ссылка.

    Что касается значения NULL — то это интересный случай, когда у счетов «на лету» меняют состав субконто. Например, добавляя субконто к счету, по которому учет ведется уже много лет, платформа заполняет значение этого субконто для проводок прошлых периодов значением NULL. Это нужно учитывать при проведении таких опасных операций.

    Вот это на платформе 8.2.18.109 не подтвердилось. При добавлении новых субконто в старых движения значение субконто устанавливается как «пустая ссылка», а при добавлении новых субконто составного типа значение устанавливается в Неопределено.

    Reply
  52. YPermitin

    (51)

    Вот это на платформе 8.2.18.109 не подтвердилось. При добавлении новых субконто в старых движения значение субконто устанавливается как «пустая ссылка», а при добавлении новых субконто составного типа значение устанавливается в Неопределен

    Возможно так и есть, на 8.2 глюки с NULL встречал в основном после обменов.

    А то что написано на ИТС — это да, это я больше для контраста вставил 🙂

    Reply
  53. oleganatolievich

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

    остальные глюки тоже ловил. актуально для новичков.

    Reply
  54. Дмитрий74Чел

    (50) посмотрите в сторону статей про «справочная информация». Там оф. «фича» есть. И вроде как в 8.3.13.каком-то там починили.

    Reply
  55. YPermitin

    (53) ВЫРАЗИТЬ не поможет, потому что платформа все равно во временной таблице приводит к указанному в статье типу, чтобы там не пытались сделать в запросе. По крайней мере так было раньше, может в новой версии что-то и поменялось.

    Reply
  56. Дмитрий74Чел
    off
    Reply
  57. YPermitin

    (55) Взял на заметку на будущее 🙂

    Reply
  58. 3vs

    (48)В том-то и дело, что монополисты.

    Reply
  59. oleg-x

    (58) Кто сказал, что монополисты? Может просто, другие решения не устраивают по деньгам или функционалу?

    Я знаю несколько контор, в которых об 1С даже в бухгалтерии ничего не знаю 🙂

    Reply
  60. YPermitin

    (54)

    Там оф. «фича» есть. И вроде как в 8.3.13.каком-то там починили.

    Увы, но не починили.

    Reply
  61. YPermitin

    (59)

    ют по деньгам или функционалу?

    Я знаю несколько контор, в которых об 1С даже в бухгалтерии ни

    Это удивительная ситуация 🙂

    Ну а так можно «радоваться», импортзамещение в действии 🙂

    Кто знает, если бы не монополия, то вот таких бы новостей не было бы:

    https://infostart.ru/journal/news/mir-1s/1s-zakrepila-razdelenie-platformennykh-litsenziy-na-prof-i-korp_1002294/

    Reply
  62. Дмитрий74Чел

    (60) нашел ту ветку: https://forum.infostart.ru/forum33/topic175327/

    Там вроде написали что в 8.3.14 все ок

    Reply
  63. YPermitin

    (62) Ура товарищи! Надо потестировать.

    Reply
  64. tormozit

    «Прикольчик» отправлен в 1С?

    Reply
  65. Darklight

    (42)1С хочет отказаться от поддержки DB2 — говорят слишком мало у кого используется да и с ней свои трудности есть. Вот и хотят себе жизнь упростить и больше ее не поддерживать. Тем более сейчас 1С идёт курсом плавного продвижения СУБД PosgreeSQL (и Posgress Pro), как альтернативы для MS SQL Server (хорошо хоть пока на Oracle не замахиваются — хотя там тоже много своих нюансов в поддержке).

    Так что, вероятно в 8.4 уже не будет поддержки DB2, вероятно поэтому выход 8.4 так задерживается именно из-за желания выпустить уже без DB2, но по так выпустить не могут:

    1C на коммерческой DB2 используют весьма крупные клиенты (у них DB2 стояла и использовалась ещё до появления на ней для неё 1С). Так что, хоть установок на коммерческой DB2 и не много, зато они весьма солидные — в общем тут, скорее не технические трудности, а, скажем так, «юридические». Но технические трудности я бы тоже списывать не стал.

    Но, от DB2 1С рано или поздно откажется!

    Хе, возможно, даже, когда-нибудь заключат партнёрское соглашение с компанией Posgress Professional и будут поддерживать только СУБД линейки Posgress Pro (Standart (будут поставлять вместе с платформой) и Enterprise (будет продаваться через магазин 1С со скидкой, особенно с хорошей скидкой в бандлах с платформой, а сама 1С будет иметь большую маржу от таких продаж) — для лицензий 1С ПРОФ (другие СУБД — только по лицензии КОРП) — хотя, это, конечно, мало вероятно, ведь это будет мешать продвижению на иностранным рынках.

    Reply
  66. Darklight

    (61)Это не причём. Не будь монополии — это разделение могло бы случиться ещё раньше. Ну или КОРП вообще не появился бы ни как отдельная лицензия ни как более продвинутый функционал!

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

    Просто в стране так сложилось, что конкурирующим продуктам не удалось так эффективно развиться. Это их проблемы. Им никто не мешал, и особых условий компании 1С не создавал. Но сейчас да — конкурировать с продуктами фирмы 1С в России очень сложно — у 1С существенные преимущества, которые они в стране себе создавали десятилетия.

    Reply
  67. YPermitin

    (66) Согласен. Но все же отсутствие конкуренции это не хорошо.

    Время покажет)

    Reply
  68. tormozit

    (28) В 1С отправил?

    Reply
  69. SlavaKron

    (68) Нет, на testplatform@1c.ru отклонили, так как версия не тестовая, а для v8@1c.ru у меня нет подписки ИТС.

    Reply
  70. tormozit

    (28) Попробовал на 8.3.13.1801. Не воспроизвелось. На 8.3.14.1592 воспроизвелось. В 1С отправил.

    Reply
  71. user612295_death4321

    Ну из моего опыта проблемы я испытываю следующие при обновлении релиза (УПП обычные формы).

    1. На версиях 8.3.10.Х — слетают привязки с форм при нестандартном DPI, абсолютно на всех существующих релизах.

    2. На версиях 8.3.11.Х — проблемы с электронной почтой при использовании метода ПолучитьЗаголовки. Крашится клиент, аналогично были протестированы абсолютно все релизы, причем крашится оно только при использовании экча, на других почтовых серверах не крашится.

    3. На версиях 8.3.12.Х, 8.3.13.Х:

    — Были некоторые проблемы с SSL сертификатами, вопрос решился немного переписанием кода.

    — У нас есть некий функционал под названием «Карта клиента», обычная форма с размещенным табличным полем в которой забита номенклатура и количество которое клиент хочет заказать. Операторы колл — центра привыкли очень быстро забивать номенклатурные позиции.

    Для примера:

    Поведение на 8.3.9.Х пользователь быстро жмет кнопки 1 + Enter + вниз:

    Номенклатура А — 1

    Номенклатура Б — 1

    Номенклатура В — 1

    Номенклатура Г — 1

    Номенклатура Д — 1

    Поведение на 8.3.12.Х и 8.3.13.Х пользователь быстро жмет кнопки 1 + Enter + вниз:

    Номенклатура А — 1

    Номенклатура Б — 0 (строка проскакивается)

    Номенклатура В — 0 (строка проскакивается)

    Номенклатура Г — 0 (строка проскакивается)

    Номенклатура Д — 4 (все что проскачило, схлопнулось в конце).

    Может быть на 8.3.14 поведение изменится. Когда прижмет обновлять платформу, проверю )

    Reply
  72. YPermitin

    (71) спасибо за хороший список.

    С обычными формами давно не работаю плотно, но похоже их поддерживать становится все интереснее 🙂

    Reply
  73. СергейК

    (64) Почему-то есть ощущение что ошибки платформы по обычным формам уже не интересны разработчику…

    Reply
  74. tormozit

    (73) Ну он их туда активно добавляет. Привнесенные ошибки исправляются без трений. Старые ошибки в обычных формах исправляются только критического плана. Прикольчик вполне может тянуть на критическую.

    Reply
  75. artfa

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

    Reply
  76. Octopus

    Сейчас обнаружил, что функция запроса ДАТАВРЕМЯ() не принимает в качестве параметров ничего, кроме явно указанных чисел. Т.е. ДАТАВРЕМЯ(2019, 2, 26) работает, а ДАТАВРЕМЯ(ГОД(&ТекущаяДата), 2, 26) — нет. Вывернулся через НАЧАЛОПЕРИОДА и ДОБАВИТЬКДАТЕ.

    Подозреваю, что объяснение простое: функция ГОД (как и МЕСЯЦ, ДЕНЬ) возвращает смешанный тип число+NULL

    Reply
  77. YPermitin

    (76) да, это давно уже стало фичей для меня))) Хотя очень непривычно.

    Reply
  78. Yashazz

    Я некоторое время назад заметил, что в работе совершенно обычных форм в толстом клиенте обычного приложения появилась эдакая частичная асинхронность. Теперь можно, запустив нечто с формы (в т.ч. совсем-совсем клиентское, или напротив, люто серверное) взять, да переключиться с этой формы, или поиграть с ней, или запустить это нечто ещё эн раз, или закрыть форму. При закрытии, чсх, запущенный процесс живёт и отлаживается. Степень этой асинхронной свободы «гуляет» от релиза к релизу.

    Reply
  79. Бубузяка

    (2) Поэтому «Стандарты разработки» рекомендуют условное оформление реализовывать в коде.https://its.1c.ru/db/v8std#content:2149184359:hdoc см. п. 2.1

    Цитата, на случай, если нет доступа к ИТС.

    «2.1. Настройку условного оформления форм и динамических списков рекомендуется делать в коде формы. Такой подход имеет ряд преимуществ перед заданием настроек условного оформления в свойствах формы:

    настройки однотипного условного оформления можно вынести в общие модули. Например, есть 80 форм, имеющих условное оформление:

    «если НЕ ХарактеристикиИспользуются, то в поле «Характеристика» вывести текст <характеристики не используются>»,

    то можно вынести эту настройку в код процедуры общего модуля;

    при объединении конфигураций есть возможность объединять условное оформление (особенно это актуально при разветвленной разработке конфигураций);

    при изменении в метаданных (например, переименовании значения перечисления) условное оформление может перестать работать. Если условное оформление настраивается в коде конфигурации, то при синтаксическом контроле модулей эта ошибка будет выявлена. Так ошибки в настройках условного оформления будут выявляться средствами автоматизированной проверки (например, АПК), т.к. будет диагностироваться ошибка при попытке получения формы.»

    Reply
  80. Dementor

    (79) спасибо. У меня доступ к ИТС есть, но другим будет полезно.

    Reply
  81. nvv1970

    (6) Все читают советы от 1С как нужно костылить, но никто не доходит до первоисточника и не понимают почему все так странно работает https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-2017

    Тут простое и наглядное объяснение https://habr.com/ru/post/205938/

    К слову, в документации по PG такой информации нету. Если кто найдет — киньте ссылкой. Есть подозрение, что методика — чистая математика, т.е. одинаковая для всех СУБД. Разница может быть лишь в максимальной длине.

    Reply
  82. YPermitin

    (81)

    Все читают советы от 1С

    Спасибо за отличный комментарий и ссылки.

    Все правильно говорите, сейчас это фича, а не баг.

    А раньше это все же был баг. Если есть версии 8.3.6 в доступе от конца 2015 года, то можете проверить — ранее округлялось на до 37 цифр в дробной части, а до 8. Это было весело 🙂

    Reply
  83. nvv1970

    (82) в доступе есть все версии.

    Раскурил эту тему ещё на 8.2

    Собственно к 1с это не имеет практически никакого отношения.

    Единственное отличие было в 8.3.12.1412, когда разработчики платформы допустили ошибку, которая вызвала переполнение разрядности cast.

    Если знаете ещё изменения — приведите пример (только не в виде результата, а в виде самих запросов)

    Reply
  84. YPermitin

    (83)

    Если знаете ещё изменения — приведите пример

    Будет время — поставлю старую версию платформы и прогуляюсь в Profiler 🙂

    Reply
  85. tormozit

    (76) ДатаВремя() — литерал функционального типа, т.е. внутри него не поддерживается вычисление выражений, а допустимы строго заданные значения. Другие подобные литералы языка запросов: ЗНАЧЕНИЕ(), ТИП(). Кстати в консоли запросов ИР по нажатию CTRL+F1 на любой функции выдается контекстная справка, где можно узнать в частности и том, является ли функция литералом.

    Reply
  86. tormozit

    (78) Не замечал такого. Можешь сделать пример для воспроизведения?

    Reply
  87. Octopus

    (85) Все еще проще, чем я предположил )))

    Reply
  88. Sergynia

    Достаточно интересная статья.

    Reply

Leave a Comment

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