Баги платформы 7.7




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

99 Comments

  1. withoutface

    Подробнее про ТаблицаЗначений.Сортировать() …

    Reply ↓
  2. IsiKosta

    Плохо что нет возможности добавлять в блоги файлы, можно было бы демонстрировать… Может кидать файлы в какой-нибудь файлообменник?

    Reply ↓
  3. artbear

    КонтФормыДокумента.НоваяСтрока — решено в ВК 1С++ и ФормЕкс — достаточно их просто загрузить, и эта фича уже работает, чем и пользуюсь уже давно, порядка 6 лет 🙂

    Reply ↓
  4. layman

    Если открыть отчеты—>Регламентированные.

    Затем зайти в Сервис—>Параметры—>Интерфейс и там поменять шрифт, размер шрифта

    то 1С выдаст ошибку и закроется

    Reply ↓
  5. Vitek

    Чет поздновато вы баги семерочные начали собрирать. Они все уже давно изжеваны.

    Reply ↓
  6. layman

    Просто к концу года должна выйти 28 платформа, по статистики. А в январе-феврале 29

    Reply ↓
  7. Vitek

    (6)Не выйдет.

    Reply ↓
  8. CheBurator

    я фигею… а что, ПРИ СОРТИРОВКЕ изменяется количество строк…? а мужики-то и не знают! Побегу расскажу…

    Reply ↓
  9. CheBurator

    и не баг и не фича, а так, наблюдение…

    а=а;

    не вызовет исключительной ситуации…

    Reply ↓
  10. vasilykushnir

    >-некорректно работает функция Сортировать()

    Если после сортировки ТЗ применить метод КоличествоСтрок(), результат будет такой же, как если бы сортировки не было.

    А каким он должен быть? Ты же не сворачиваешь ТЗ…

    Reply ↓
  11. vasilykushnir

    (4) Есть такое дело. Не часто, но вываливается.

    Reply ↓
  12. vasilykushnir

    (9) А вот сейчас проверю… Самому интересно стало.

    Reply ↓
  13. vasilykushnir

    (9) Че, а вот так не пробовал 🙂 ?

    а=а/0;

    Reply ↓
  14. ssp_

    2 бага, с которыми сталкиваюсь постоянно:

    1. Бухучет + УРИБ: Меняем конфигурацию в ЦИБ, затрагивая план счетов. После получения новой конфигурации в ПИБ запускается пересчет итогов, после которого получаем жутко кривые бухитоги. Лечится удалением индексов и запуском пересчета итогов вручную.

    2. Синтаксический контроль для внешнего отчета после «Сохранить как» ссылается на старый файл.

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

    Reply ↓
  15. vasilykushnir

    + к (13)

    Код
               Попытка
          С  &nb
    Reply ↓
  16. vasilykushnir

    Блин, и я ошибку впилял, надо

    с = 5/0;

    Reply ↓
  17. Vitek
  18. O-Planet

    Упал, читая первый пример. Писал явный ламер и нуб. Вот так все работает:

    Код
    Процедура Сформировать()
            ТЗ =СоздатьОбЪект("ТаблицаЗначений");
            ТЗ.НоваяКолонка ("Колонка","Число" );
            ТЗ.НоваяСтрока (); ТЗ .Колонка =0;
            ТЗ.НоваяСтрока (); ТЗ .Колонка =0;
            ТЗ.НоваяСтрока (); ТЗ .Колонка =1;
            ТЗ.Сортировать ("+Колонка");
            П=0;
            Сообщить(ТЗ .НайтиЗначение(1 ,П,"Колонка" ));
    КонецПроцедуры
    

    Показать полностью

    Reply ↓
  19. ssp_

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

    Reply ↓
  20. Pari

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

    Reply ↓
  21. Pari

    + (20) Уточнение. Не открывается не только форма внешней обработки, но и встроенной в конфигурацию. И не только программно, но и напрямую (через «Файл» — «Открыть» для внешней, или через «Операции» — «Обработки» для встроенной).

    Reply ↓
  22. poppy

    Лажа какая-то.

    Максимальное количество группиповок = 5.

    С чего бы это? Нет такого ограничения, поэтому и в документации по языку — ни слова.

    Функция Формат()

    Формат(1.2, «Ч.0») = 1.2

    Формат(’12/01/2002′, «ДДДММММГГ») = «12.01.02»


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

    Reply ↓
  23. O-Planet

    Вообще, да. Больше некоторого числа группировок семерка не позволяет делать запрос. Вроде, после 5-и, действительно. Поэтому в ТиС на всех отчетах стоит такое ограничение.

    А вот у меня реально несколько раз получался странный бак, то внешний отчет ругался на попытку выполнить метод ИсходнаяТаблица(), хотя и таблица присутствовала, и ошибок никаких не было. Странно, что оно работало сперва, а через какое-то время слетало. Восстанавливалось удалением таблицы и созданием новой, абсолютно такой же.

    Reply ↓
  24. Vitek

    (23)А до этого было проведение документа?

    потеря контекста скорее всего.

    Reply ↓
  25. MikStyle

    У одного из клиентов была следующая проблема на ТиС типовой. Открывался справочник «Номенклатура» из него далее форма любого товара в нем кнопка справочники — Цены. Далее это все оставлялось БЕЗ ДВИЖЕНИЯ МЫШИ ИЛИ КЛАВИАТУРЫ. Через несколько минут цены начинали сами собой изменяться, причем интервалы разные, а через какое-то время опять возвращались к исходным. Причем в это время мог никто не работать. Мне сняли это на сотовый. Проблема наверное решилась (точно не могу сказать сейчас с ним не работаю) после исправления модуля формы списка справочника «Цены»: При октрытии, Владельца сразу в переменную и потом используем именно ее, а создание «таблицы расчетных цен» в процедуру «СформироватьТаблицуРасчЦен()». Такое ощущение было, что все время менялся владелец справочника… Повторюсь одна копия базы открыта одним пользователем через терминал, и 100% никто по удаленке не прикалывается…

    Reply ↓
  26. script

    Баг-нибаг.

    В любой версии платформы нельзя получить перечень (список, выборку) групп из справочника запросом (ТОЛЬКО ГРУПП и ИМЕННО ЗАПРОСОМ).

    Reply ↓
  27. CheBurator

    (26)

    Код
    //*******************************************
    Процедура Сформировать()
       НеГруппа=ПолучитьПустоеЗначение("Справочник.Номенклатура");
       ТекстЗапроса="
       |Родитель = Справочник.Номенклатура.ТекущийЭлемент.Родитель;
       |Группировка Родитель упорядочить по Родитель.Наименование Все;
       |Условие(НЕ(Родитель=НеГруппа));
       |";
       
       Запрос = СоздатьОбъект("Запрос");
       Запрос.Выполнить(ТекстЗапроса);
       ТЗ = СоздатьОбъект("ТаблицаЗначений");
       Запрос.Выгрузить(ТЗ,1,0);
       ТЗ.ВыбратьСТроку(,"тест");
    КонецПроцедуры
    

    Показать полностью

    .

    устроит?

    Reply ↓
  28. CheBurator

    (23) подтверждаю… и на данный момент есть такой отчет…

    Reply ↓
  29. CheBurator

    (25) стопудово шаловливые ручки или алгоритмобяки

    Reply ↓
  30. CheBurator

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

    Reply ↓
  31. IsiKosta

    к 31

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

    Reply ↓
  32. Pari

    (31) <Сейчас оставляю на форме кнопку «Закрыть»

    Достаточно элемента «Текст», без заголовка и идентификатора.

    Reply ↓
  33. Pari

    (31) <кусок кода выносят иногда во внешнюю обработку и в ПриОткрытии() выполняют необходимое

    Получается, что из внешней обработки можно сделать «хранилище» процедур. Можно ли как-то это использовать?

    Reply ↓
  34. vasilykushnir

    (33) Хранилище процедур можно сделать в дополнительном глобальном модуле или внескольких модулях (что с успехом использую) — кури Формекс от Альфа.

    Reply ↓
  35. JohnyDeath

    (33),(34) Пусть человек сразу к хорошему привыкает! Кури 1с++ http://www.1cpp.ru/ и используй свои классы.

    Reply ↓
  36. poppy

    (23)

    > Вообще, да. Больше некоторого числа группировок семерка не позволяет

    > делать запрос. Вроде, после 5-и, действительно. Поэтому в ТиС на всех

    > отчетах стоит такое ограничение.

    Оооо, блин, чЮдо-прогаммер.

    Ограничения в отчетах ТиС не связаны с ограничениями платформы и(или) объекта «Запрос».

    Смторим тут http://infostart.ru/projects/1154/

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

    Reply ↓
  37. O-Planet

    (36) Ну значит, сейчас можно. Я помню точно, что пару раз вылетало сообщение, что в запросе больше пяти группировок…

    Reply ↓
  38. poppy

    (37)

    В отчетах ТиС и сейчас вылетает такое сообщение:

    Код
       Если КоличествоГруппировок > 5 Тогда
          Предупреждение("Нельзя сделать больше 5 группировок!",60);
          Возврат;
       КонецЕсли;            
    

    Показать полностью

    Это особенность конкретных отчетов конкретной (хотя и типовой) конфигурации… 🙂

    Почему об этом ограничении должно быть сказано в документации по языку?

    Reply ↓
  39. vip

    (38) Срезала чЮдо ;))

    Это шоб не обзывался.

    Reply ↓
  40. O-Planet

    А я тоже всю жизнь ограничения ставил и сильно от этого страдал, хоть и не догадывался… :(((((((

    Reply ↓
  41. O-Planet

    Ладно! На затравку — супер глюк, о котором почему-то ни кто ни где не пишет…

    Сколько раз замечал, чо если конкретно загрузить семерку чем-то вроже загрузки или восстановления данных, переиндексировкой, пересчетом итогов или регистров, но в конфигураторе, то имеет место следующее явление. Если в процессе этого действа просто увести мышь хотя бы на кнопку Пуск (о хранителях экрана, Alt+Tab я даже не говорю), то семерка подвисает навечно! Возможно, прослеживается не на всех компах, а с некоторым дефицитом памяти.

    Reply ↓
  42. O-Planet

    А что ни кто не спит-то? 0_о

    Reply ↓
  43. vasilykushnir

    (41) Ты сам почти ответил на свой вопросс:

    1. Чем больше база тем больше мозгов для подобных действий.

    2. На хрюшке, а особенно хомке — это сплошь и рядом. У хомки диспетчер памяти ни в дугу, ни в красную армию. На сервере 2003 ни разу подобного не замечал даже на более слабом компе.

    Вывод — неча на 1С кивать, если железо — дерьмо.

    Reply ↓
  44. Bobak

    (41)Подвисает только на компьютерах с процессорами с «гипертрейдингом», так кажется это называется. Т.е. процессор с эмуляцией двухпроцессорности.

    И вроде даже не подвисает навечно, а просто оооочень медленно работает.

    Решается проблема отключением «гипертрейдинга» в биосе.

    Reply ↓
  45. Светлячок

    (43) <<На сервере 2003 ни разу подобного не замечал даже на более слабом компе — а вот у меня подвисает, ну или, как говорит (44) — «оооочень медленно работает», что делать-то? Нервно покуривать? 🙂

    Reply ↓
  46. polzovatel

    В 7.7 есть еще такой глюк: когда пишешь Сообщить(«текст»+переменная) — то все работает, а когда Сообщить(переменная) — не выводится в табло и все тут! пользуюсь для быстрой проверки работы модуля. Такой

    Reply ↓
  47. vip

    (43)(44)(45) «Подвисает» на любом компе и на любой ОС.

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

    Ничего в этом страшного нет, просто малоприятно.

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

    Reply ↓
  48. polzovatel

    +(46) такой глюк происходит не всегда, но он есть и как-то я потратила часа 4 на то чтобы пнять что не так 🙂

    Reply ↓
  49. v_dog

    Проблема большая очень если файл регистра в опер учете достигает объема 1,2 Gb тогда перевод точки актуальности из месяца в месяц происходит очень долго притом что чем больше месяцев за раз пытаешся перенести то больше приходится ждать если первый месяц проходит за 7 минут то 2 уже за 15 и т.д. в геометрической прогрессий.

    Reply ↓
  50. IsiKosta

    на 46

    Из описания процедуры Сообщить() видно, что как параметр передается строковое выражение, поэтому надо переменную (не тип «Строка») преобразовать в тип «строка». Например «» + переменная или Строка(переменная). Так что это не баг и не глюк.

    Reply ↓
  51. Bobak

    (47)Речь не об этом, по крайней мере я не об этом. Эта проблема решается http://infostart.ru/profile/1329/projects/798/

    А в случае (44) именно «подвисает».

    Reply ↓
  52. vasilykushnir

    (46) Дык конструкцией Сообщить(«текст»+переменная) ты явно указываешь, что «переменная» должна преобразоватся к текстовому виду. Без Сообщить(» «+переменная), Например Сообщить(переменная), 1С-ка почему-то не может «сообразить» что ей делать с типом переменной и какой он у нее….

    (47)+5

    Reply ↓
  53. vasilykushnir

    (51) Выйдет Абадонна с больницы — попрошу, чтобы восстановил приблуду по ссылке. Очень часто выручала в подобных ситуациях.

    Reply ↓
  54. slawa

    (25)

    Было открыто две формы справочника номенклатуры в них спозиционированы разные товары.

    Окошко с ценами может быть только одно — вот оно и переключалось между ценами этих товаров.

    Reply ↓
  55. polzovatel

    (50) я не написала, но переменная заранее либо число, либо строка. Но действительно понаблюдаю, может и я накосячила 🙂 но в том случае когда 4 часа потратила было Строка(переменная), исправила на Строка(«»+переменная) и все заработало…это точно, я проверяла 0_0

    Reply ↓
  56. Ёпрст

    (27) Меня — нет. В выборке не будут Группы Без Элементов….

    Так что низачОт.

    Reply ↓
  57. Светлячок

    (47), (51), (53) — Спасибо!

    Reply ↓
  58. Ёпрст

    Вот, очередной [:]||||||||||||||||[:] от Рупора Абсурда

    Процедура Сформировать()

    тз = СоздатьОбъект(«ТаблицаЗначений»);

    тз.НоваяКолонка(«Тест»);

    Для Номер=1 По 10 Цикл

    тз.НоваяСтрока();

    тз.Тест = Формат(Номер, «ЧП»);

    КонецЦикла;

    тз.Сортировать(«Тест»);

    тз.КоличествоСтрок(8);

    тз.КоличествоСтрок(4);

    тз.КоличествоСтрок(2);

    тз.КоличествоСтрок(1);

    тз.ВыбратьСтроку();

    КонецПроцедуры

    Reply ↓
  59. alexqc

    Счас попробую пройтись по багам с объяснениями:

    1. Сортировка и КоличествоСтрок():

    Читаем документацию:

    КоличествоСтрок(<Колич>)

    Назначение:

    Устанавливает/возвращает количество строк в таблице значений.

    Параметры:

    <Колич> — необязательный параметр. Новое количество строк в таблице значений.

    Заметьте, НИГДЕ не сказано, оставшиеся строки начинаются с 1-й строки. Это лишь ожидаемое поведение, ожидаемое, но не прописанное.

    А теперь объяснение: Если сделать лья ТЗ ЗначениеВСтрокуВнутр, и посмотреть на результат, то в нем можно обнаружить что во-первых, ТЗ выгрузится поколоночно, а не построчно, во-вторых, там присутствует колонка с нумерацией строк, при чем для ТЗ после Сортировать() они идут не по порядку. Логично предположить, что в памяти ТЗ хранится именно так же: массив колонок+ колонку с индексом. Сортировка не меняет физического порядка строк, а меняет только индексы (понятно, так быстрее). и соответственно, уменьшение кол-ва строк делается простым убиранием лишних элементов из массивов именно в физическом порядке. Вот оттуда и этот глюк.

    По поводу формата: с числом действительно глюк. А с датой — опять-таки домыслы. Если прочитать документацию :), то обнаружим, что формата ДДММММГГ попросту нет! Есть ДДММММГГГГ, есть ДДММГГГГ, но нет ни ДДММММГГ, ни указания что части ММ/ММММ и ГГ/ГГГГ можно использовать произвольно (мне бы, к примеру подошел бы еще формат ГГГГ-ММ-ДД, но я ж не возмущаюсь что так не выдает!). А для неясного формата 1Ска выдает результат «как есть». не удивлюсь, что если установить режим показа дат «4 цифры года», то ДДММММГГ выдаст 12.01.2002 :).

    Reply ↓
  60. sml

    странно, что никто не написал о глюке отладчика 1С.

    Если запущен отладчик, то нельзя запустить другую базу 1С в режиме предприятия — висяк получается с ней.

    Еще глюкаво работает с ОЛЕ-сессией. Например, если открываешь какую-нить 1Сину ч/з ОЛЕ, а в ней выскакивает модальное окно (например, не рассчитаны итоги и пр.), то 1С виснет. Приходится срубать оба процесса диспетчером задач.

    Reply ↓
  61. alexqc

    Ветка длинная, оказывается, про формат оказывается уже сказали :).

    По поводу а=а/0:

    Если перед это строкой вставить а=1 — то будет вполне ожидаемая ошибка :). Суть в том, что при выполнении а=а/0 «самой по себе» в А в момент выполнения деления содержится пустое значение (ТипЗначения=0). Согласно документации, выполнение выражения определяется первым типом его операнда. Т.е. выражение должно будет обрабатываться как выражение «пустого типа». Работа с пустым типом в доке не описано, но вероятно действует правило, что «любое выражение пустого типа дает пустой тип» (в этом можно убедиться, выполнив что-то вроде ПустоеЗначение()+123). Так что тут скорее не глюк, а «неопределенное поведение».

    Reply ↓
  62. vasilykushnir

    (61) Очень даже логично. Плюсик за красивую логику.

    Reply ↓
  63. alexqc

    (17), (18) и http://www.klerk.ru/soft/1c/?1069

    А это между прочим действительно глюк.

    Читаем доку:

    НайтиЗначение(<Знач>,<Строка>,<Колонка>)

    …

    Параметры:

    <Знач> — значение для поиска.

    <Строка> — идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке.

    <Колонка> — … Если при вызове метода передать в этот параметр номер или идентификатор колонки, то поиск будет осуществляться только по указанной колонке

    Что с того, что мы передали и номер строки, и идентификатор колонки? Должен быть поиск в указанной (строке,колонке), т.е. в одиночной ячейке! И т.к. значения нет — вернуть 0!

    Ну а для тех кто говорит, что таки низзя задавать и то и то, предлагаю выполнить в том же примере

    Сообщить(ТЗ .НайтиЗначение(1 ,1, 0 )); — тут явно поиск по колонкам в 1-й строке, но почему-то возвращает 1 (а должен 0).

    И даже более того:

    Код
    Процедура Сформировать()
            ТЗ =СоздатьОбъект("ТаблицаЗначений");
            ТЗ.НоваяКолонка ("ППП","Строка" );
            ТЗ.НоваяКолонка ("Колонка","Число" );
            ТЗ.НоваяСтрока (); ТЗ .Колонка =0;
           ТЗ.НоваяСтрока (); ТЗ .Колонка =0;
             ТЗ.НоваяСтрока (); ТЗ .Колонка =1;
            ТЗ.Сортировать ("+Колонка");
            Сообщить(ТЗ .НайтиЗначение(1 ,1,"Колонка" ));
       КК=0;
            Сообщить(ТЗ .НайтиЗначение(1 ,1,КК));
       Сообщить(КК);
    КонецПроцедуры
    

    Показать полностью

    получим КК=2, т.е. вполне себе находит, в нужной колонке, тока не в той строке.

    И чего интересно (18) автора нубом обозвал?

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

    Reply ↓
  64. alexqc

    По поводу макс. кол-ва группировок: у меня есть отчет, в котором фильтрация/группировка по куче признаков товара, самих признаков 5+собственно товар, +еще сколько-то вышестоящих группировок, + группировка по документу движения. С полным набором включенных группировок тестировалось, и работает. Так что на счет макс. количество группировок — деза, если оно и есть — то достаточно большое, чтобы этого ограничения не ощущать. А макс. значение которое в некоторых отчетах стоит — это действительно связано только с отчетами. Это отчеты, в которых состав и кол-во группировок меняются; в самой таблице отчета для группировок заданы секции, допустим, «Строка1″,»Строка2″,…,»Строка5». Вывод секции сделан наподобие Таб.ВывестиСекцию(«Строка»+номерГруппировки). Естественно, в таком случае НомерГруппировки=6 вызовет ошибку — такой секции попросту нет. Вот для того и поставили ограничения :).

    Reply ↓
  65. alexqc

    (41) Мож таки не глюк, а «необновление»? Этим именно ХР и иже с ним грешат. Если включить режим совместимости с 2000, то тогда хоть в статусной строке что-то видно…

    Reply ↓
  66. valerasv

    некорректно работает функция Сортировать()

    А каким образом сортировка (перестановка по определенному порядку) строк может повлиять на их количество? Или я чего то недопонимаю?

    Reply ↓
  67. alexqc

    про группы справочника запросом

    Только что проверил запрос

    «род = Справочник.Контрагенты.Родитель;Группировка род;»

    Все работает 🙂 (27й релиз, SQL).

    Кстати, вот такой запрос

    » //{{ЗАПРОС(ККК)

    |ТекущийЭлемент = Справочник.Контрагенты.ТекущийЭлемент;

    |Код = Справочник.Контрагенты.Родитель.Код;

    |род = Справочник.Контрагенты.Родитель;

    |Группировка Код;

    |»

    Почему-то группирует не по кодам родителей, а по кодам самих элементов :).

    Reply ↓
  68. alexqc

    (66) Хоть и говорилось, но всеж повторю.

    КоличествоСтрок(КС) — оно УСТАНАВЛИВАЕТ количество строк. Соответственно глюк такой: создаем таблицу, добавляем строки, сортируем так, чтобы новый порядок отличался от начального, потом устанавливает количество строк < текущего к-ва. Строки удаляются не с конца, а «с конца в старом порядке».

    Reply ↓
  69. Ёпрст

    (67) См. (56)… НизачОт..

    Reply ↓
  70. Dolly_EV

    (60) <Еще глюкаво работает с ОЛЕ-сессией. Например, если открываешь какую-нить 1Сину ч/з ОЛЕ, а в ней выскакивает модальное окно (например, не рассчитаны итоги и пр.), то 1С виснет. Приходится срубать оба процесса диспетчером задач. >

    При открытии окна (модального или не модального) в ОЛЕ, база не виснет, просто на ОЛЕ-базе НЕТ ВИДИМОГО ОКНА ВИНДЫ, решается след. образом:

    1). попробовать пощелкать Alt+Tab

    2). вытянуть окно наверх в диспетчере задач

    Reply ↓
  71. Ёпрст

    (70) Гораздо проще открыть базу запущенную по Оле сторонней приблудой и посмотреть что там происходит в натуре…

    Reply ↓
  72. O-Planet

    (47) >> Никакое это не подвисание, просто перестает обновляться экран.

    Это я тоже видел. В данном случае — речь именно о подвисании. Пример. Жду 2 часа, не выдерживаю, использую три кнопки. В результате, повторный процесс с нетроганием мыши и отключенным хранителем происходит 30 минут.

    Reply ↓
  73. vip

    (72) Ты не пишешь, какая тяжелая работа в этот момент выполнялась.

    Через 2 часа подвисание только тремя пальцами и можно исправить (гм…).

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

    Reply ↓
  74. O-Planet

    Речь идет о восстановлении из архива выгруженных данных. При повторе я их все снес, чтобы не путались.

    Reply ↓
  75. vip

    (74) Сегодняшней ночью я именно этим и занимался в разных позах.

    Никакой разницы по времени не заметил.

    Может у тебя доки были с пустой датой или ТА на начало 23 века стояла.

    Reply ↓
  76. pfa

    (23) тотже глюк решился переносом команды создания объекта таблица в начало процедуры

    Reply ↓
  77. Fisherru

    «Если после сортировки ТЗ применить метод КоличествоСтрок(), результат будет такой же, как если бы сортировки не было.

    »

    Честно, не понимаю как сортировка таблицы может привести к изменению количества строк?

    «4) Невозможно сохранить большую таблицу в формате Excel. Программа зависает (или долго думает). »

    Уже есть замечательные разработки ЧеБурашки и в теме 1C + Excel [MXL to XLS] от 10.03.2008 ака Ужас бухгалтера !

    Причём вторая, в отличие от первой, более корректно сохраняет формат 1С-ки и позволяет в бесплатной версии задать имя файла 😉

    Не в укор ЧеБурашке. А плюсы обоим!

    Reply ↓
  78. Pari

    (77) 2 Fisherru

    Это нужно читать между строк.

    А пояснения в (58) и (59)

    Reply ↓
  79. Fisherru

    Сорри.

    Спешил домой и не прочитал всю ветку…

    Reply ↓
  80. dima_gsv

    Ошибки найденные мной в 1С Предприятии 7.7.

    1. Некорректный перенос точки актуальности на конец дня в котором нет документов.

    Ошибка проявляется при попытке установить точку актуальности на конец дня в котором нет ни одного документа. Некорректность заключается в том, что время ТА становится равным 26:01. Если у вас релиз 21, то после этого документы перестают проводиться, пока вручную не переместить ТА на какой-нибудь документ. В 23 релизе всё проводится нормально и 26 часов в сутках уже особо не мешают. Хотя, всё равно, как-то не по себе.

    Пример:

    Код
    Процедура ПриНачалеРаботыСистемы()
       ...
       УстановитьТАПо(ПолучитьДатуТА()+1);
       ...
    КонецПроцедуры

    Показать полностью

    2. Не работает обратный порядок выборки элементов справочника по реквизиту с учётом иерархии.

    Проверено в 21 и 23 релизе.

    Пример:

    Код
    Процедура Сформировать()
       // Справочник Партии подчинён справочнику Товары
       // Справочник Партии содержит реквизит Отдел с признаком Сортировка
       Партия=СоздатьОбъект("Справочник.Партии");
       Партия.ИспользоватьВладельца(Товар);
       Партия.ОбратныйПорядок(1);
       Партия.ВыбратьЭлементыПоРеквизиту("Отдел",Константа.ОснОтдел,1,0);
       Пока Партия.ПолучитьЭлемент(1)=1 Цикл
          // Ни одна строка не будет выведена, если Партия.ОбратныйПорядок()=1
          Сообщить(Строка(Партия));
       КонецЦикла;
    КонецПроцедуры

    Показать полностью

    Стоит только поменять

    Партия.ОбратныйПорядок(1);

    на

    Партия.ОбратныйПорядок(0);

    как в выборке появляются элементы.

    3. Некорректно работает запрос, если путь в запросе длиннее одного родителя.

    Следующие строки запроса дают одинаковый результат:

    Код
    |ВидТовара=Регистр.ОстаткиПартийТоваров.Товар.Родитель.Родитель.ВидТовара;
    |ВидТовара=Регистр.ОстаткиПартийТоваров.Товар.Родитель.ВидТовара;

    Показать полностью

    Даже если вписать .Родитель десять раз, это будет считаться как один. Проверено на 21 и 23 релизе на DBF базе.

    Reply ↓
  81. dima_gsv

    В предыдущем посте проглотилось пару строк «КонецПроцедуры» в коде. Вобщем, исходник с картинками тут: http://dima-gsv.pisem.net/1cv77errors.html

    Reply ↓
  82. Shaman100M

    Попробуйте в форме списка справочнике 7.7 создать кнопочку с перепозиционированием текущего элемента (например, по введенному в диалоге коду или наименованию)

    а затем нажать ее находясь в режиме редактирования текущего элемента «в списке». На «боевой» базе экспериментировать не советую!!!

    Reply ↓
  83. Shaman100M

    (77) Речь идет, скорее всего о том, метод КоличествоСтрок() выдает то же количество строк что и до сортировки, однако, таблица значений после этого становится неотсортированной. Так?

    Reply ↓
  84. Shaman100M

    + (83) прочитал все комменты.

    (56) (27) (26) можно сделать не с помощью запроса, но с пом. метода ВыбратьЭлемен

    Reply ↓
  85. IsiKosta

    Давайте все же про текущий 27 релиз писать

    Reply ↓
  86. nikresh

    релиз 27

    в диалоге формы реквизит — справочник (форма списка справочника с закладками)

    если форма открыта модально, то при выборе элемента справочника — открывается форма списка справочника БЕЗ закладок,

    а если НЕ модально — С закладками

    Reply ↓
  87. lhfrjy

    Если после сортировки ТЗ применить метод КоличествоСтрок(), результат будет такой же, как если бы сортировки не было.»

    Чел очевидно имел в виду Функцию Свернуть(), но если в ней указать правильно все параметры то количество строк

    в ТЗ уменьшается.

    Reply ↓
  88. begemot

    22. «Лажа какая-то.

    Максимальное количество группиповок = 5.

    С чего бы это? Нет такого ограничения, поэтому и в документации по языку — ни слова.»

    При выполнении запроса стоится индекс. Его длина = Длина поля группировки 1 + Длина поля группировки 2 + Длина поля группировки 3….

    Так вот, если длина этого индекса составит больше 255, то в запросе будет ошибка.

    Reply ↓
  89. vasilykushnir

    (85) про 27-й, так про 27-й…

    НЕ ПРОБОВАТЬ ПОВТОРИТЬ НА РАБОЧЕЙ БАЗЕ!!!!!!!

    Итак: 1Cv77 дебилд 027, база скульная (довольно большая — МДФ 28 гиг).

    Решил удалить в конфигуратере ненужный справочник (простой, как дверь в военкомате — код, наименование и все). При сохранении начала проверять ссылки, когда долго зависла на регистрах — достало конкретно. Прервать естественно не удалось — удалил процесс через медежер задач. После вызова конфигуратора продолжила свое грязное дело, пришлость опять грубо вырубить. Перегрузил комп, захожу в конфигуратор — продолжает, сволочь… Махнул рукой — дал доработать жо конца.

    А вот теперь самое интересное: при закрытии конфигуратора жутко матерится, что память не может быть reed. Фиг с тобой! Кое-как позакрывал всплывающие окна с ошибкой. Открытие ЛЮБОЙ базы в конфигураторе и последующее закрытие вызывает ту же ошибку (перегрузка компа — до лампочки).

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

    Вывод: кривые ручки и не на такое способны…. Так что неча кивать на глюки платформы.

    Reply ↓
  90. bambula

    Все эти баги почти полный отстой по сравнению с тем, что напишу:

    В компоненте бух учета 27-го релиза платформы, захожу монопольно для восстановления последовательности. Восстанавливаю последовательность, останавливается на РКО (расходный кассовый ордер). Переношу его в конец дня (в этот день был еще и ПКО), восстанавливаю последовательность еще раз. Опять останавливается на том же РКО, и его позиция (дата и время) не изменилась. Т.е. мои действия с документом не сохранились! Причем это с любым видом документа, если при восстановлении последовательности выпала ошибка при проведении.

    Reply ↓
  91. sks

    90: Нужно провести этот документ вручную.

    Причём предварительно придётся на первом доке этого дня установить ТА(через контекстное меню)

    Reply ↓
  92. Рамзес

    Метод НомерДняГода для пустой даты возвращает 2:

    НомерДняГода(‘ ‘)=2

    Reply ↓
  93. леша

    (92) Учитывая то, 01.01.1980 г. был вторник, думаю, что НомерДняГода(‘ ‘)=2 вполне нормальный результат. Пустая дата — это же как ‘01.01.80’.

    Кстати, НомерДняГода(‘ ‘ + 1) = 3!

    Reply ↓
  94. zaic

    Неисправляемые Баги со временем становятся Фичами.

    Reply ↓
  95. Strange Device

    Досадный глюк, который так и не починили: если для числового реквизита в табличной части установлена галочка «неотрицательный», то после выгрузки табличной части в ТЗ, в колонку соответствующую этому реквизиту не удается установить отрицательные значения

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

    Reply ↓
  96. alyuev

    А с такой ошибкой никто не встречался? ❓ —

    в печатной таблице,

    Если

    объединить ячейки отметив галочку «По выделенным столбцам» в закладке «Положение» в свойствах ячейки,

    ТО

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

    ИначеЕсли

    ячейки объединить обычным образом — кнопкой «Объединить/Разъединить» —

    ТО

    поиск работает нормально.

    КонецЕсли

    Reply ↓
  97. Собеседник

    п. 1,2 — не согласен что это баг. лечить не нуно

    3 — не мешает

    4 — вылечено уже

    5 — а в снеговике тоже так и че?

    По поводу «Режим «Отладчик» и «Конфигуратор»» — конструктивные особенности. не мешает

    Reply ↓
  98. Jokester

    // не понял на счет сортировки. вот простой пример.. создаем обработку с ТЗ (ид «ТЗ») заливаем..

    ТЗ.НоваяКолонка(«Н»);ТЗ.НоваяКолонка(«Н_Знач»,»Число»);

    Для Сч=1 по 5 Цикл

    ТЗ.НоваяСтрока();

    ТЗ.Н=»Элемент № «+Сч;

    ТЗ.Н_Знач=Сч;

    КонецЦикла;

    ТЗ.Сортировать(«-Н»); Сообщить(«= «+ТЗ.КоличествоСтрок());

    // ну и где тут изчезает сортировка сортировка? 7.70 027

    (80)

    |Родитель = Справочник.Товары.Родитель;

    |РодительРодителя = Справочник.Товары.Родитель.Родитель;// Родитель = РодительРодителя — это не баг, а так и должно быть.

    Я если честно, даже не могу понять назначения вашего примера. Для чего это нужно? Вы собрались сделать выборку и группировку по родителю родителя или что? Как вы себе это представляете?

    Reply ↓
  99. Leja

    (99) читайте внимательнее! «Если после сортировки ТЗ применить метод КоличествоСтрок() для уменьшения количества строк…»

    означает, что если после сортировки пишем:

    ИсхКолво = ТЗ.КоличествоСтрок();

    ТЗ.КоличествоСтрок(ИсхКолво-1);

    то получаем… ОПА!

    Reply ↓

Leave a Comment

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