Мина замедленного действия в методе 1С8 «НайтиСтроки», и ... разминирование.

Публикация № 117041 14.02.12

Разработка - Практика программирования

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

Немногие знают, что метод НайтиСтроки в 1С работает не всегда ожидаемым образом.

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

Поэтому рекомендую добавить в глобальный модуль две функции НайтиСтроки и ПослеНайтиСтроки и вызывать вместо  М = ТЗ.НайтиСтроки(Структура) метод М = НайтиСтроки(ТЗ, Структура). Или последовательность: М= ТЗ.НайтиСтроки(Структура);  ПослеНайтиСтроки, ТЗ);

Параметр ТЗ во второй метод передается для совместимости с 1с80, где нет функции Владелец() у строки табличной части.

 

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

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

 

 

Функция НайтиСтроки(ТЗ, Структура) Экспорт

      
М = ТЗ.НайтиСтроки(Структура);

      
ПослеНайтиСтроки(М, ТЗ);

КонецФункции



Процедура
ПослеНайтиСтроки(М, ТЗ = Неопределено) Экспорт

       Если
М.Количество() = 0 Тогда

             Возврат;

       КонецЕсли;

      
//Для совместимости с 1с80

      
Если ТЗ = Неопределено Тогда

            
ТЗ = М[0].Владелец();

       КонецЕсли;



      
ТЗ2 = Новый ТаблицаЗначений();

      
ТЗ2.Колонки.Добавить("Индекс");

      
ТЗ2.Колонки.Добавить("Строка");



       Для Каждого
Эл ИЗ М Цикл

            
НСтр = ТЗ2.Добавить();

            
НСтр.Индекс = ТЗ.Индекс(Эл);

            
НСтр.Строка = Эл;

       КонецЦикла;



      
ТЗ2.Сортировать("Индекс");

      
М.Очистить();

       Для Каждого
Стр2 ИЗ ТЗ2 Цикл

            
М.Добавить(Стр2.Строка);

       КонецЦикла;

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

 

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

 

Скачать файлы

Наименование Файл Версия Размер
down.zip

.zip 5,01Kb
16
.zip 5,01Kb 16 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. fishca 1208 14.02.12 23:21 Сейчас в теме
Программист предполагает, что после вызова метода строки в нем будут расположены в таком же порядке, как в исходной таблице значений.

Вот сколько пишу на восьмерке, ни разу не предполагал что строки будут расположены в таком же порядке, как в исходной таблице. Где это может понадобиться? Если на порядок закладываешься, то контролируй этот порядок сам.
Merkalov; Xershi; ErshKUS; Natgrey; shiaju; maxis33; AlbinaAAA; Natally_; Yury1001; amiralnar; borman; +11 Ответить
2. fixin 4092 15.02.12 00:08 Сейчас в теме
(1) никогда в отсортированной ТЗ не искал по составному ключу?
crosby; adhocprog; +2 Ответить
3. Magister 134 15.02.12 01:17 Сейчас в теме
Я вот уже больше 5 лет с восьмеркой работаю, и тоже никогда не предполагал такого.
(2) А где такое может понадобиться? Если сильно надо что-то найти в большой таблице - делаю через запрос (с использованием временных таблиц).
amiralnar; +1 Ответить
6. fixin 4092 15.02.12 07:42 Сейчас в теме
(3) а если в небольшой? Тоже запросом, из пушки по воробьям? Господи, да откройте любую типовую, найдите поиском НайтиСтроки и посмотрите, где этот метод применяется для отсортированной таблицы.
Вообще-то все задачи распределения, партионного списания (не только по товарам, есть задачи списания, где важна последовательность). Короче везде, где НайтиСтроки используется для отсортированной таблицы. У меня - сплошь и рядом.
Lancelot-2M; DFinteX; adhocprog; Deletex; +4 Ответить
7. Поручик 4534 15.02.12 08:48 Сейчас в теме
(6) Поискал. 95% использования метода НайтиСтроки - поиск какой-то одной строки, удаление найденных строк, добавление в другую таблицу.
Merkalov; +1 Ответить
8. Famza 84 15.02.12 08:54 Сейчас в теме
(6) да из пушки по воробьям или кувалдой кнопки забивать - без разницы. Вся платформа ориентирована на использование запросов везде и всюду, за исключением записи данных. Так говорится в жкк.
wolfsoft; +1 Ответить
10. KulSer 15.02.12 09:30 Сейчас в теме
(6) fixin.
Если в небольшой, то не проще ли вообще отказаться от стандартного метода НайтиСтроки()? Тупо перебираем строки в исходной таблице, проверяем условие поиска, если Истина, то добавляем найденную строку в результирующую таблицу (или в массив строк, смотря, что нужно получить). Против Ваших двух циклов в процедуре ПослеНайтиСтроки() будет один цикл по исходной таблице.
Вы можете возразить, что если в исходной таблице 10000 строк, а НайтиСтроки() возвращает 10, то два цикла по 10 строк заведомо быстрее одного цикла по 10000 строк. Но я отвечаю конкретно на пост (6), "если в небольшой". А если в "большой", то присоединяюсь к посту (3) "запрос (с использованием временных таблиц)".
Хотя допускаю, что бывают ситуации, когда исходная таблица не мала не велика, и предложенный Вами алгоритм будет оптимальным.
12. fixin 4092 15.02.12 10:37 Сейчас в теме
(10) а вы замеры сделайте. НайтиСтроки - заточенная под платформу функция, отработает быстрее, чем перебор, неважно, большая таблица или нет.

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

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

(11) а я встречал, да и на партнерском тема тоже озвучена. Индексирование таблицы ускоряет поиск, но может привести к нарушению последовательности строк. Многие даже и не знают о такой фиче.
adhocprog; +1 Ответить
77. Magister 134 07.03.12 10:34 Сейчас в теме
(6)
Признаюсь, списание по партиям упустил из виду. Но, как тут уже заметили, это вина программистов, которые не читают документацию.
Был забавный случай в УПП для Украины 1.0 (которая ещё под 8.0 была).
Там в отчете Обороты счета (или Анализ счета, запамятовал уже) данные по счетам в колонки выводились с использованием что-то типа:
СоответствиеСчетов = Новый Соответствие;
... заполнение ...
Для Каждого Счет Из СоответствиеСчетов Цикл
...
КонецЦикла

Так вот, в 8.0 Соответствие обходилось всегда в том же порядке, в котором в него добавлялись элементы. В 8.1 это поведение изменилось, и порядок обхода стал другим (в документации, кстати, и в 8.0 было написано, что порядок обхода не определен).
Естественно, отчет при переходе на 8.1 выводил белиберду.
Мне этот момент хорошо запомнился :)
--
Ещё неплохой момент с библиотекой glibc в Linux.
В документации сказано, что memcpy предназначена только для копирования непересекающихся областей памяти. Поведение в случае пересекающихся неопределено. Что, впрочем, непомешало криворуким программистам Adobe использовать именно эту функцию в Flash Player (вместо memmove, которая как раз отработает правильно всегда).
С очередным обновлением glibc звук в Flash Player стал хрипеть, а именно - потому, что в glibc оптимизировали функцию memcpy, и её поведение изменилось (всё также в пределах документации).
--
К чему это я. Криворукие программисты есть не только в 1С :)
78. fixin 4092 12.03.12 17:44 Сейчас в теме
(77) статья и признана объяснить одну неочевидную вещь.
crosby; adhocprog; +2 Ответить
101. fzt 13.12.14 20:09 Сейчас в теме
(3) Magister, мне похожее понадобилос прямо сейчас, но я порядок не предпологаю. Контролирую.
В запросах тоже порядок не гарантируется, тут уж как индекс на диск положен. ТЗ скармливаю запросу как временную таблицу, мне нужно получить некоторые данные, а совать на вход в запрос все данные из ТЗ - ресурсоёмко, много их. Глупо не оптимально потом построчно проводить поиск между результатом запроса и ТЗ. Менее ресурсоёмко в один проход записать результаты.
Редко, но нужно.

(5) echo77, собственно выше и смежный пример. Есть некая ТЗ, помимо прочих столбцов (с данными) незаполнены артикулы номенклатуры, нужно получить их из справочника. Позиций номенклатуры в ТЗ на порядки меньше количества её в справочнике. Естественно это будет запрос, вот только построчный поиск соответствий - путь низкой квалификации, или раздолбайства (когда время выполнения выходит за разумные пределы).
9. fishca 1208 15.02.12 09:14 Сейчас в теме
(2) искал, но никогда не загладывался на порядок строк
50. oleg974 123 22.02.12 08:41 Сейчас в теме
(1) fishca,
Целиком и полностью поддерживаю. Я тоже всегда контролирую порядок сам...

И хм... может не в тему вопрос. А разве господина Осипова не выгоняли с сайта со скандалом и безвозвратным удалением аккаунта? 0_о
51. fishca 1208 22.02.12 09:26 Сейчас в теме
(50)
А разве господина Осипова не выгоняли с сайта со скандалом и безвозвратным удалением аккаунта? 0_о

Доржи объявлял амнистию, теперь фиксин набирает обороты по новой
103. VL_admin 29 18.03.15 11:33 Сейчас в теме
(1) fishca, расскажу как у меня эта проблема возникла.

Данные в ТЗ забираю из базы данных oracle. Если кто не знает, то 1С до Оракла по возможностям языка очень далеко. В 1С нет ни case в order by, ни аналитических функций, ни прочих фишек. Поэтому грех не воспользоваться возможностями для сортировки, чтобы потом в 1С не пересортировывать дикими способами.

Так вот после того как отсортированная Ораклом ТЗ попала в 1С я делаю выборку из нее с помощью НайтиСтроки().
И мне нужно сохранить порядок, а его нет....

Для себя решил поставить перебор таблицы вместо НайтиСтроки().
4. Поручик 4534 15.02.12 01:42 Сейчас в теме
В первый раз слышу про такие предположения и вот сейчас вспоминаю, когда я рассчитывал на порядок строк, где это требовалось и какие меры предпринимались. На ум лезут только запросы с выгрузкой в таблицу значений.
5. echo77 1259 15.02.12 07:09 Сейчас в теме
(0) Было бы неплохо получить от автора побликации пример, когда "неправильный" порядок строк в массиве, возвращаемом методом НайтиСтроки может выйти боком.

Первое, что мне пришло на ум, это выбрать строки, а потом удалить их из таблицы. Хотя при последовательно переборе элементов массива и удалением строк из ТЗ методом Удалить(<СтрокаТаблицыЗначений>) все должно пройти корректно.
11. gfvg 15.02.12 10:37 Сейчас в теме
Ни разу не встречал чтоб порядок строк в массиве отличался от порядка в ТЗ. Да и код предложенный автором будет вечность работать и применим(?) только для маленьких таблиц. А получать массив отсортированный как ТЗ может очень во многих случаях понадобиться, списание партий/издержек и т.д. Единственное что могу представить, почему у массива порядок строк другой получился, то это проиндексированная ТЗ.
13. i132 115 15.02.12 14:09 Сейчас в теме
вариант: воспользоваться опертором (ТЗ.)Скопировать(<Строки>, <Колонки>)
Для случая когда известны поля сортировки и не нужна связь с исходной таблицей.

НайдСтроки = ТЗ.НайтиСтроки(Структура);
тз2 = ТЗ.Скопировать(НайдСтроки);
ТЗ2.Сортировать(строкаСортировки);
Euroset1; dj_serega; robix; DrAku1a; Yury1001; fixin; +6 Ответить
14. fixin 4092 15.02.12 16:28 Сейчас в теме
(13) а ты уверен, что он их скопирует в правильном порядке?
это можно проверить, кстати. Если да, то это шикарный метод.
Правда, связь обычно нужна. Для уменьшения остатков партий при списании
15. i132 115 15.02.12 17:27 Сейчас в теме
(14) я не пролистал синтакс-помощник до конца: можно написать еще проще:

тз2 = ТЗ.Скопировать(СтруктураОтбора);
ТЗ2.Сортировать(строкаСортировки)

Циатта из синтакс-Помощника:

Вариант синтаксиса: Скопировать по отбору

Скопировать(<ПараметрыОтбора>, <Колонки>)
Параметры:
<ПараметрыОтбора> (необязательный)
Тип: Структура.
Ключ структуры - идентификатор колонки, а значение структуры - значение отбора.

<Колонки> (необязательный)
Тип: Строка.
Список колонок для копирования в формате: "Колонка1, Колонка2...".

---------------

про порядок строк при копировании нигде не сказано поэтому новую таблицу надо отсортировать по образцу исходной.

---------------
забавный вариант удаления лишних строк из таблицы:
ТЗ=ТЗ.Скоприровать(новый Структура("ИмяКолонки",ЗначениеРеквизита))
16. fixin 4092 15.02.12 19:44 Сейчас в теме
(15) на сортировку тратится много времени. К тому же сортировка не всегда известна и равна отбору. ТЗ может быть отсортирована ХЗ как.
55. Necytij 23.02.12 18:31 Сейчас в теме
(16) (54)
Да, читал, но быстро запамятовал, просто тут из ничего такую пургу раскрутили, что никак тема из головы моей не выходила, зачем?.
Вы не указали, чем такой метод по-вашему плох.
на сортировку тратится много времени. К тому же сортировка не всегда известна и равна отбору. ТЗ может быть отсортирована ХЗ как.

Что это вообще означает? У вас же точно такая же сортировка...
ТЗ2.Сортировать("Индекс");
М.Очистить();

и при чем тут отбор?
По 54 - кто отменил обращение к таблице по индексу? ТЗ[ТекущаяСтрокаТЗ2.индекс] - чем вам не ссылка на основную строку ТЗ?
Простите, но, по-моему, вы баламут.
56. fixin 4092 23.02.12 19:55 Сейчас в теме
(55)
Довольно распространенная в моей практике задача - есть большая отсортированная таблица значений, сортировали ее ранее, другими алгоритмами, фиг знает как. Суть не в этом. Я должен выполнить по ней списание по партиям товара из другой ТЗ (просто список товаров), уменьшая количество в этой большой таблице значений.

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

А вы о чем, что-то я не понял?
41. Zas1402 21.02.12 10:38 Сейчас в теме
(13) i132, спасибо очень помогли
86. Yury1001 1452 24.05.12 09:11 Сейчас в теме
На днях состряпал отчет с динамическим количеством колонок, использовал СабжМетод с расчетом на правильный (однозначный) порядок результата поиска, т.к. работа бюджетная – заморачиваться не стал, пока всё в порядке. Если для последних релизов (на сегодня 8.2.15) статься справедлива могут перемешаться цифры внутри строк, если что воспользуюсь (13) (15).
87. fixin 4092 24.05.12 11:49 Сейчас в теме
17. awk 730 16.02.12 15:32 Сейчас в теме
(0) Видел в 2007 году в БП 8 глобальную функцию Долги по фифо или как-то так, когда посмотрел на результат, там было что угодно, только не фифо. Полез - использовали именно эту функцию.
19. fixin 4092 16.02.12 16:46 Сейчас в теме
(17)(18) вот видите, а некоторые товарищи в начале говорили, что фигня, все через запросы... А про овраги забыли...
21. awk 730 16.02.12 17:42 Сейчас в теме
(19) Это всего лишь показатель квалификации кодеров стандартных конфигураций. Это не проблема для тех, кто читал документацию.
23. fixin 4092 16.02.12 18:13 Сейчас в теме
(21) не все читают документацию так буквоедически. разумно ожидать от платформы совпадения порядка строк или хотя бы параметра в функции, который бы обеспечивал такой порядок. Такое решение от платформы - прямая неинтуитивная подстава.

(22) ну мало ли что вас еще ждет на длинном жизненном пути...
25. awk 730 16.02.12 19:06 Сейчас в теме
(23) Это все равно что говорить: функция с побочным эффектом - подстава. Подстава - это недокументированное поведение.
Например декларируем ФИФО, а реализуем рандом. У меня на поиск ошибки тогда ушло пол дня. На багфикс 1 минута.
24. cj512 28 16.02.12 18:24 Сейчас в теме
(17)Да даже странно, что в 1с с этим не сталкивались, при чем, что сами так кодят.
Большинство сортировку в запросе отрабатывают.
26. fixin 4092 16.02.12 22:42 Сейчас в теме
(24) Когда ты пишешь "большинство", прикладывай пожалуйста, ссылки на исследования, соцопросы и т.п. личный стереотип поведения, возведенный в ранг "большинство" смотрится смешно. просто совет.
(25) все же должны быть какие-то стандарты принятые в отрасли. Еще одной подставой было преобразование в строку по региональным стандартам чисел, а не просто в 232983928392.1234. Это только в 1С так. Есть стандарты в отрасли программирования и их надо соблюдать.
18. Artemuch2 16.02.12 16:06 Сейчас в теме
Блин где же вы раньше были то. никак не мог разобраться когда процедура выдает не те результаты что планировал
20. v.l. 16.02.12 17:05 Сейчас в теме
Неожиданно, я бы сказал "внезапно".

Спасибо за статью, недавно встречал что-то подобное, но плюнул искать. Просто отсортировал ТЗ и всё.
22. borman 77 16.02.12 17:52 Сейчас в теме
Статью следовало озаглавить: "На всякий случай имейте в виду..."
Действительно ни разу не требовалась такая выборка отсортированная определенным образом.
27. Oleg_nsk 17.02.12 08:16 Сейчас в теме
А разве в синтаксис помощнике говорится, что функция НайтиСтроки что-то там упорядочивает? В описании сказано: "Осуществляет поиск строк таблицы значений, отвечающих заданным условиям поиска". Возвращемое значение: "Массив строк таблицы значений, соответствующих условиям поиска..." Все остальные предположения есть домыслы.
Natally_; +1 Ответить
29. fixin 4092 17.02.12 10:39 Сейчас в теме
(27) но откуда предположить, что порядок строк при этом меняется, и не такой, как в исходной ТЗ. Однозначно - подстава.
(28) ага, выгружать ТЗ из памяти на сервер, получать обратно запросом по каждому поиску и только для того, чтобы упорядочить строки? Нуну.
30. amiralnar 8 17.02.12 12:13 Сейчас в теме
(29) Я даже предположить не мог, что найденные строки в массиве могут иметь какой-то порядок. Такое свойство у них отсутствует в прикладном и логическом смысле.
Неправильно ты, дядя фиксин, восьмерку ешь. Надо колбасой вниз. Так вкуснее будет.
31. fixin 4092 17.02.12 13:47 Сейчас в теме
(30) у тебя какое-то нестандартное мышление.
28. gavrikprog 114 17.02.12 09:14 Сейчас в теме
Да, если честно для его примера нужен запрос. Тоже никогда не рассчитывал на упорядоченные правильно строки.
Нафиг изобретать велосипеды.
Имхается, что по быстродействию будет тоже самое.

Автор, приведи еще примеры использования...
dj_serega; +1 Ответить
32. dkprim 5 18.02.12 07:55 Сейчас в теме
хоть опыт работы с 8кой у меня небольшой, но тоже никогда не возникало потребности в том, о чем пишет автор публикации. за информацию, конечно, спасибо. возможно, когда-нибудь потребуется воспользоваться данным методом.. а вообще, запросы люблю юзать :)
33. fixin 4092 18.02.12 22:09 Сейчас в теме
(32) еще возникнет, я с 1С8 с 2005 года.
34. adhocprog 1202 18.02.12 23:28 Сейчас в теме
35. tormozit 6402 19.02.12 23:48 Сейчас в теме
Поддерживаю автора. Проблема встречалась мне неоднократно.
36. fixin 4092 19.02.12 23:51 Сейчас в теме
(35) вот видите. у практиков такая проблема возникает, в отличии от теоретиков, которые якобы запросами пользуются...
37. amiralnar 8 20.02.12 04:10 Сейчас в теме
(35) tormozit, Если можете, покажите, пожалуйста, в каком коде вам встречалась эта проблема? Обращались ли вы в 1С с вопросом об обсуждаемом поведении платформы?
38. s.sintsov 229 20.02.12 08:23 Сейчас в теме
1C вроде как никому не обещала, что метод найти строки вернет результирующий массив строк в том же порядке, что и исходные строки в таблице. Если на этом не заострили внимание в описании функции, так это только потому, что никто и подумать не мог, что профессиональные программисты будут ожидать от этой функции именно такого поведения. Вы когда-нибудь выборку по SQL таблице делали? Вы что же ожидаете, что результат выборки без дополнительного упорядочивания всегда будет в том же самом порядке, что и исходная таблица? А НайтиСтроки() - это та же самая выборка, только запрос за Вас платформа формирует.
39. fixin 4092 20.02.12 10:39 Сейчас в теме
(38) вот потому и написана эта статья, что интуитивно ожидается что порядок строк сохранится, а на выходе он получается случайным. Причем в 80% случаев сохраняется а в 20% случайный.
Все фичи 1с знать невозмножно, поэтому эта статья - огромный такой варнинг! ;-)
42. kapustinag 21.02.12 11:30 Сейчас в теме
(38), (39)
Помнится, когда я начинал работать с СУБД Oracle 20 лет назад, то в руководстве разработчика в самом начале изучения запросов было сказано, что результаты запроса - если не указана сортировка - не обязательно соответствуют физическому порядку строк в таблице. И все, больше никаких вопросов нет.

То есть из-за некачественной документации фирмы 1С и родилась и эта проблема, и дискуссия по ней.
Я согласен, что интуитивно человек ожидает вполне определенную сортировку в данном случае, поэтому, если программа ведет себя не так, поставщик должен был добавить одно предложение в справочную систему, и закрыть вопрос.

Противникам таких "интуитивных ожиданий": конечно, все люди разные, и интуиция у всех по-разному работает. Так в том-то и дело, что можно было бы легко позаботиться обо всех, предупредить их ошибки и проблемы. А можно было...сделать как сделано.
45. fixin 4092 21.02.12 12:20 Сейчас в теме
(42) повторяю в стопятьсотый раз - эта тема как раз о неинтуитивном моменте в движке 1с. Ибо интуитивно такой фигни ожидать нельзя. У всех интуиция разная, поэтому предупреждаю для тех, кто все же ожидает от 1С сохранения нормального порядка ТЗ - опасайтесь! Для этого и написана статья.
46. s.sintsov 229 21.02.12 13:17 Сейчас в теме
(42) Во-во, с документацией у 1С всегда были проблемы, вернее времени на это не оставалось, либо изначально была поставлена задача все тонкости работы платформы объяснять только на учебных курсах.
40. пользователь 20.02.12 15:53
Сообщение было скрыто модератором.
...
43. i132 115 21.02.12 11:50 Сейчас в теме
Интересно, а откуда вы получаете таблицу значений?, -из запроса? - может быть лучше переписать запрос с итогами - выгружать его в дерево значений или обходить по иерархии.
Работа с деревом будет быстрее если вам надо обработать всю таблицу а не только выбранные строки.
другой вариант получения дерева из таблицы: (с использованием СКД) http://infostart.ru/public/16408/
44. fixin 4092 21.02.12 12:19 Сейчас в теме
(43) По разному бывает, но гонять ТЗ из памяти на сервер и обратно не вижу смысла. Обработка достаточно нетривиальная всегда в таких случаях в памяти. Мой метод нравится мне больше.
47. пользователь 21.02.12 13:20
Сообщение было скрыто модератором.
...
48. andy2011 21.02.12 14:20 Сейчас в теме
спасибо очень интересно
49. the1 918 21.02.12 21:12 Сейчас в теме
Надеюсь, в будущих релизах 1С будет гарантировать...

Вот это по-настоящему смешно. Сравните язык 1с8 после языка 1с77, а потом вдумайтесь - будет ли 1С что-либо делать под кодеров.
52. fixin 4092 22.02.12 10:33 Сейчас в теме
(49) 1с8 по сравнению с 1с7 - шаг вперед. УФ в 1с82 - шаг вбок.
53. Necytij 23.02.12 11:00 Сейчас в теме
Долго читал тему, и все не могу понять с чего весь сырбор. ну есть проблема, и что? Я тоже никогда не сталкивался, видимо потому что работаю в основном на БП. И надеюсь, как можно меньше людей столкнутся. Но это ведь далеко не самый страшный кошмар от 1Сников. так что никакого "большого варнинга" не вижу...
да и метод, имхо, оставляет желать лучшего.
А почему бы не проставить индексы сначала еще В ТЗ, а потом
ТЗ2 = ТЗ.Скопировать(ТЗ.НайтиСтроки(Структура));
ТЗ2.Сортировать("Индекс");
Это на нескольких отборах, я думаю, хорошо скажется на производительности, да и короче текст намного...
54. fixin 4092 23.02.12 13:52 Сейчас в теме
(53) надо описывать любые кошмары, большие и маленькие. То, что вы написали, уже предлагали. Иногда важно сохранить ссылки на исходную таблицу для обработки (например уменьшения остатков по партиям).
57. Necytij 23.02.12 20:46 Сейчас в теме
1. Вы сильно преувеличиваете размер проблемы.
2. Вот вы по ТЗ№3 определили что вам в строке Х из ТЗ№2 надо списать Нную сумму, и вы хотите в соответствующей строке ТЗ№1 убрать также Нную сумму. Ну так в строке Х ТЗ№2 есть столбец Индекс, который при обращении к таблице ТЗ№1 по индексу ласт вам ту самую строку:
Х = ТЗ2[5]; //- нужная(в данном конкретном случае именно 6я) строка в маленькой таблице
НужнаяСтрокаБольшойТаблицы = ТЗ[X.Индекс]; //- нужная строка в большой таблице

Вы же свою БОЛЬШУЮ ТЗ№1 не пересортировываете по 100 раз, пока проводите списание и индексы не собьются... так?
58. fixin 4092 24.02.12 00:50 Сейчас в теме
(57) все зашибись, но про исходный порядок вы забыли. Перебирать найденные строки нужно в том же порядке, что в исходной таблице. Тут простым извлечением индекса не обойдешься, нужна сортировка по индексу.
59. Necytij 24.02.12 18:08 Сейчас в теме
(58)
Вы издеваетесь!!!?????
Сначала во всей ТЗ первоначальной проставьте в столбец индекс индекс строки перебором "для инд = 1 по ..."
Потом отбираете строки и сортируете уже новую ТЗ по столбцу индекс!!! Потом когда из строки Х в Табл.значений надо попасть в оригинальную строку вы обращаетесь к строке в ТЗ[СтрокаТаблЗначений2.Индекс].
Сколько раз можно одно и то же писать? Занимаетесь тут маразмом. Не зря вас видать в прошлый раз забанили.
60. fixin 4092 24.02.12 18:15 Сейчас в теме
(59) я вам объяснял, что порядок сортировки таблицы неизвестен и сортировать не есть хорошее решение. Если не верите, напишите универсальную функцию и объясните, как туда передавать порядок сортировки. Как минимум, эта универсальная функция будет сложнее моей (появится еще один параметр - порядок сортировки) и потребует от программиста больше знаний, нужно еще знать, как отсортирована исходная ТЗ.
К тому же сортировать таблицу по ключам дольше, чем сортировать таблицу по индексу. И копировать всю таблицу дольше, чем копировать индексы. не вижу преимущества вашего подхода.

Вы хоть сто раз 2+2 = 5 напишите, от этого утверждение не станет верным. Попробуйте включить логическое мышление.
61. Necytij 24.02.12 23:02 Сейчас в теме
Процедура ПередНайтиСтроки(ТЗ)
	ТЗ.КОлонки.Добавить("МойИндекс", НекотореОписаниеОписаниеТипаЧисло);
	для инд = 1 по ТЗ.Количество() цикл
		ТЗ[Инд].МойИндекс = инд;
	конеццикла;
КонецПроцедуры

Функция НайтиСтрокиВТЗ(ТЗ, СтруктураОтбора)
	М = ТЗ.НайтиСтроки(СтруктураОтбора);
	М.Сортировать("МойИндекс");
	Возврат М;
КонецФункции

Процедура Х()
	...
	ПередНайтиСтроки(ТЗ);
	...
	<некий цикл перебора в котором осуществляется последовательная выбора из ТЗ новоявленным методом НайтиСтрокиВТЗ>
	СтруктураОтбора = ...;
	Строки = НайтиСтрокиВТЗ(ТЗ, СтруктураОтбора);
	для инд = 1 по Строки.Количество() цикл    //цикл всего лишь чтобы показать
//как осуществлять обращение к основной ТЗ, вместо того чтобы городить лишнее
		Сообщить("обращение к оригиналу строки № " + строка(инд) + " из " + 
     строка(Строки.Количество()) + " выбранных: " + Строка(ТЗ[Строки[инд].МойИндекс].РеквизитТЗ));
	<конеццикла>
инд = 0;
	для каждого Строка из Строки цикл    //цикл всего лишь чтобы показать
//как осуществлять обращение к основной ТЗ, вместо того чтобы городить лишнее
инд = инд +1;
		Сообщить("обращение к оригиналу строки № " + строка(инд) + " из " + 
    строка(Строки.Количество()) + " выбранных: " + Строка(ТЗ[Строка.МойИндекс].РеквизитТЗ));
	<конеццикла>
	<конеццикла>
КонецПроцедуры
Показать

Проверки синтаксиса нет - писал в блокноте.
При чем тут ваши ключи от квартиры где деньги... - беру ваш пример и убираю оттуда половину текста, оставил лишь образование столбца индекс, но не в выборке, а в основной таблице, и сортировку сразу после выборки. ЭТО ПОЧТИ И ЕСТЬ ВАШ ТЕКСТ! Только без лишнего типа такого:
НСтр.Индекс = ТЗ.Индекс(Эл);

p.s. К тому же привычка называть переменные и процедуры в виде зарезервированных платформой методов, процедур - дурной тон. Иногда можно напороться на неработоспособность куска программы из-за этого. Пару раз допускал такую ошибку, больше не хочется, терять от получаса на такой ерунде.
67. i132 115 27.02.12 12:51 Сейчас в теме
(61) Necytij, в коде
Функция НайтиСтрокиВТЗ(ТЗ, СтруктураОтбора)
   М = ТЗ.НайтиСтроки(СтруктураОтбора);
   М.Сортировать("МойИндекс");
   Возврат М;
КонецФункции
у вас ошибка: Найти строки возвращает массив а у массива нет метода сортировать.
Наверно вы имели ввиду
Функция НайтиСтрокиВТЗ(ТЗ, СтруктураОтбора,ИмяКолонкиИндекс)
   ОтобраннаяТЗ = ТЗ.Скопировать(СтруктураОтбора,ИмяКолонкиИндекс);
   ОтобраннаяТЗ.Сортировать(ИмяКолонкиИндекс);
   Возврат ОтобраннаяТЗ;
КонецФункции

еще можно попробовать неправильный ваиант циклической ссылки - в каждой строке хранить ссылку на саму себя, зато полсе ТЗ.Скопировать(СтруктураОтбора,ИмяКолонкиИндекс+","+ИмяКолонкиССылки) мы получим Таблицу из двух колонок -индекс и ссылка на начальную ТЗ
68. Necytij 27.02.12 19:09 Сейчас в теме
(67) i132,
Если уж дошли почти до конца топика, то могли прочитать и 63, и 66. Результаты теста вашего метода.
1 проход (по 1/6 ТЗ за выборку, с повторением предыд. результатов):
fixin | народ | fixin модиф. | i132
0.82 vs 1.24 vs 0.64 vs 2.09
2 прохода
1.64 vs 1.61 vs 1.3 vs 2.2
3 прохода
2.47 vs 1.97 vs 1.95 vs 2.43
6 проходов
4.92 vs 3.09 vs 3.89 vs 3.14
10 проходов (количество отобранных строк в сумме уже превышает количество строк таблице, некоторые строки учавтсвуют в нескольких результатах отбора)
8.23 vs 4.65 vs 6.48 vs 4.08

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

Процедура ПередНайтиСтроки4(ТЗ)
	ТЗ.КОлонки.Добавить("МойИндекс", Новый ОписаниеТипов(Новый КвалификаторыЧисла(15,0)));
	ТЗ.КОлонки.Добавить("МояСтрока", Новый ОписаниеТипов("СтрокаТаблицыЗначений"));
	инд = 0;
	Для каждого Строка Из ТЗ Цикл
		Строка.мойИндекс = инд;
		Строка.МояСтрока = Строка;
		инд = инд + 1;
	КонецЦикла;
КонецПроцедуры

Функция НайтиСтрокиВТЗ4(ТЗ, СтруктураОтбора)
   М = ТЗ.Скопировать(СтруктураОтбора,"МойИндекс,МояСтрока");
   М.Сортировать("МойИндекс");
   Возврат М.ВыгрузитьКолонку("МояСтрока");
КонецФункции

Процедура ОсновныеДействияФормыМетод4(Кнопка)
   Если ТЗ.Количество() = 0 Тогда
     Возврат;
   КонецЕсли;
	
   ПередНайтиСтроки4(ТЗ);
   Для А = 1 По Проходов Цикл
      Строки = НайтиСтрокиВТЗ4(ТЗ, Новый Структура("инд1,инд5", 1, 3));
      Сообщить("Количество " + строка(Строки.Количество()));
      для каждого Строка из Строки цикл
         инд2 = Строка.Инд1;
      конеццикла;
   КонецЦикла;
КонецПроцедуры
Показать


p.s. Жаль что тут спойлеров нет, хоть тот же код прятать.
Morales; i132; +2 Ответить
69. fixin 4092 27.02.12 19:33 Сейчас в теме
(68) включу ваш метод в статью.
Только не понял, что такое методы народ и fixin_мод.
то что fixin - это родной метод, понятно.

Кстати, по замерам - на что больше всего тратится времени?
Можно попробовать выгружать индексы в список и пользоваться методом СортироватьПоЗначению, как вариант.

А что, на получение строки по индексу тратится много времени, что вы для нее колонку создали?
96. AlexO 132 09.12.14 17:25 Сейчас в теме
Если вы предложите более быстрый способ упорядочивания массива найденных строк, буду благодарен.

(69)
включу ваш метод в статью

И где? ))
И предложили, и благодарность он заслужил, а ты, Сергей, даже обещание не сдержал :)
94. Morales 18.07.14 18:35 Сейчас в теме
(68) Necytij, Спасибо, кратко и понятно, буду использовать
62. fixin 4092 25.02.12 10:48 Сейчас в теме
Выражайтесь проще.
Суть вашей мысли - добавить столбец в таблицу, пронумеровать его порядком строк и сортировать по нему найденные строки.
Не забудьте, что у массива (именно его возращает метод НайтиСтроки) нет метода сортировки по колонке, извольте его написать, и чтобы это работало быстрее чем мой метод.
Учитывая, что добавление колонки с индексом и ее заполнение требует некоторых предварительных действий (моя процедура же просто заменяет стандартную), а эффективность не доказана, пока практичная ценность вашего метода еще не доказана.

Повторяю - напишите рабочую функцию в моей обработке, тогда поставим вам ЗАЧЕТ. Но как вариант принимается, правда пока не понятно, хороший ли это вариант...

К тому же, не вижу смысла добавлять колонку индекса, если индекс каждой строки и так можно получить методом Индекс()
63. Necytij 26.02.12 11:06 Сейчас в теме
(62)
опечатка - вместо
М = ТЗ.НайтиСтроки(СтруктураОтбора);

то что уже с вами обсуждали:
М = ТЗ.Скопировать(СтруктураОтбора);

Кодить в данном случаем нужно вам - у меня даже нет подходящего набора данных.
64. fixin 4092 26.02.12 12:15 Сейчас в теме
(63) в структуру отбора нужно добавить еще поле созданного вами индекса
по-прежнему не вижу преимуществ вашего метода. Напишите готовую функцию.
65. Necytij 26.02.12 12:52 Сейчас в теме
(64)
точно?
Если указан отбор, то только строки из отбора будут скопированы. Если отбор не указан, то будут скопированы все строки таблицы значений. Если указаны колонки, то только эти колонки будут скопированы. Иначе, будут скопированы все колонки таблицы значений.
У кажете в отбор значение индекса, даже если пустое - максимум что вернет - 1 строку.
66. Necytij 26.02.12 18:27 Сейчас в теме
Писалось потому что настоящей работой заниматься не хотелось, писал под 8.2.14. Толстый клиент, локальная база. Данные формируются в самой форме обработки - создается таблица на 100,000 строк, в которой в несколько столбцов хранятся числа - остаток от деления на цифры. проц i3 2100. Если кто захочет посмотреть: запускаете, жмете инициализировать, ставите количество проходов, включаете замер в конфигураторе, жмете на кнопку в форме на панели основных действий. Модификация метода заключается в замене ТЗ2 при сортировке отобранных строк на список значений.

fixin | народ | fixin модиф. (сек, замеры из отладки. Замер начинается на момент запуска процедуры с циклом выборки, заканчивается в момент окончания процедуры, инициализация и заполнение таблицы на 100к строк, сюда не входит).
Отбор по 1/6 части строк (по 2м столбцам, где нечетное и НомерСтроки % 6 = 3, хоть второе условие и заведомо делает первое предположение верным, машина об этом не знает).
1 проход
0.82 vs 1.24 (при этом 0.85 сек(68%) ушло на заполнение индекса в таблицу) vs 0.64
2 прохода
1.64 vs 1.61 vs 1.3
3 прохода
2.47 vs 1.97 vs 1.95
6 проходов
4.92 vs 3.09 vs 3.89
10 проходов (количество отобранных строк в сумме уже превышает количество строк таблице, некоторые строки учавтсвуют в нескольких результатах отбора)
8.23 vs 4.65 vs 6.48

при отборе по половине строк за 1 раз (отбор четных / нечетных строк)
fixin | normal | fixin mod.
1 проход
2.49 vs 1.94 vs 1.93
2 прохода
4.95 vs 3.0 vs 3.83
Прикрепленные файлы:
ВнешняяОбработкаФиксин.epf
70. Necytij 27.02.12 22:38 Сейчас в теме
Народ - потому что не этот метод был предложен не только мной.
Модифицированный - читайте 66
Модификация метода заключается в замене ТЗ2 при сортировке отобранных строк на список значений.


Построчно разбирал только свой метод - народ. Корректировал методы заполнения столбца индексами. Большая часть времени? Количество проходов разное. Хотите посмотреть? Скачайте обработку из поста.

Если вы будете сортировать не СортироватьПоЗначению, то кроме индексов у вас там ничего не будет, и чтобы потом заполнить массив, вам придется опять же каждую строку выдергивать из ТЗ по ее индексу из отсортированного списка значений. Я пошел в модифицированном немного другим путем - сделал СортироватьПоПредставлению, где представление - представляет собой индекс. Если бы это было вам интересно, уже бы посмотрели код.
71. tulaka 28.02.12 11:18 Сейчас в теме
72. fixin 4092 28.02.12 11:35 Сейчас в теме
(71) может числовой массив можно как-то по другому отсортировать, тем более что исходный порядок известен.
Может можно обойтись без сортировки?

смотрите, допустим мы получили методом найтистроки строки 12, 10, 45, 38, 41.
Их правильный порядок известен как-бы, ведь есть исходная таблица.
неужели никак нельзя расположить строки в этом порядке?
76. fixin 4092 07.03.12 10:17 Сейчас в теме
(72) гладко было на бумаге. Вы забыли про время переброса из памяти на сервер и обратно.
(75) рад за вас. я предпочитаю, чтобы неинтуитивные моменты были описаны в документации или исходя из опыта.
104. AlexO 132 02.03.12 15:41 Сейчас в теме
(72)
только после прочтения комментов понял, о чем статья ))
найтистроки строки 12, 10, 45, 38, 41

В (59) Necytij об этом и писал - находите индексы своих <строки 12, 10, 45, 38, 41> в исходной таблице, и по ним ищете эти же строки в таблице-результате. Ну и сортировка по какому-либо признаку. И все при условии - в таблице-результате не делали переиндексацию после сортировки (не сбивали индекс).
75. ValeriVP 06.03.12 20:06 Сейчас в теме
Программист предполагает, что после вызова метода строки в нем будут расположены в таком же порядке, как в исходной таблице значений.

Только не очень умный программист так будет предполагать
79. daho 8 22.03.12 06:56 Сейчас в теме
fixin - давай в том же духе!!! надо ж кому-то этот навоз ворошить... :))) а вообще спасибо, такие фичи знать всегда полезно... вот только хрен их все блин запомнишь....
а программисты бывают не только криворукие, но и пьяные, обкуренные, уставшие, кормящие детей, играющие попутно в квейк и шахматы ну и в конец просто зае%$#ннные чем или кем либо... :)
а талант не пропьешь!!!
80. MPV 30.03.12 20:25 Сейчас в теме
Спасибо за информацию. Недавно задумывался как раз над этим вопросом, но лень искать было.
81. i132 115 16.04.12 11:41 Сейчас в теме
Еще пример борьбы с неочевидной сортировкой - сортировка по кнопке сортировать - например если сортировать таблицу по колонке с Значением = const порядок строк поменяется (не надо было сортирровать!)
Вот как можно улучшить кнопку сортировать: http://infostart.ru/public/125020/
82. i132 115 28.04.12 17:44 Сейчас в теме
Про РезультатЗапроса.Выгрузить() в документации тоже не сказано про порядок строк, когда нибудь может перемешать
83. fixin 4092 03.05.12 10:30 Сейчас в теме
(82) гм, действительно... придется пересортировывать для надежности.
84. Buster 18.05.12 11:49 Сейчас в теме
не имеет никакого смысла использовать эту ерунду. Разве только для того, чтобы замедлить работу программы, а то уж быстро она работает как-то...
При правильном расположении рук возвращается всё в том же порядке, а не в каком-то хаотичном.
Следует не лепить костыли куда попало, а научится писать правильные алгоритмы.
85. fixin 4092 18.05.12 13:31 Сейчас в теме
95. AlexO 132 09.12.14 17:20 Сейчас в теме
(84) Buster,
При правильном расположении рук возвращается всё в том же порядке, а не в каком-то хаотичном.

При каких руках у вас возвращается предсказуемый порядок строк? Т.е. без танцев и бубнов с индексами на обеих берегах выдачи-получения данных вы получаете в результате запроса расположение записей, аналогичное их расположению в БД?
Либо вы открыли недокументированную фишку, которую разработчики БД упустили из виду (сама получилась), либо ничего не поняли из проблемы несинхронности порядка записей при их Создании-Записи-Чтении.
Т.е. проигнорировали саму эту проблему абсолоютно )
88. fzt 27.05.12 22:53 Сейчас в теме
Улыбнули страсти.
А вот спасибо Автор. Пиши ещё =)
Только что собирался использовать сей метод, решил отгуглить для копипаста, буду иметь ввиду.
Интуитивно ожидал сохранения порядка строк.
Кстати по поводу интуиции. Я это ожидал поскольку много лет работал с кодом, который получает весомый пакет данных. И только апосля упорно с ним работает, сортирует, раскладывает на классификаторы etc. Дело привычки обжувать данные в памяти, нежели тратить ресурсы на запросы к БД. Да и специфика такова, что в момент запроса, БД может физически испариться, я не говорю про возможные блокировки, ожидание в очереди.
То есть алгоритмы поиска придуманные для Я.В.У. почти все гарантируют сохранение порядка строк. Всё-таки непривычно, что 1С по каждому чиху запрос пользует.

P.S. Использовать не буду, но в мемориз покладу.
P.P.S. Товарищи защищавшие писателей справки 1С, ваша въедливость при чтении документации заставляет думать о большом количестве свободного времени. Заведите себе девушку, жену, любовницу или ещё какую личную жизнь. Это когда радуешься НЕ работе ;-). Столько просьб привести примеры из жизни на 1С. Господа, систем под которые пишутся скрипты или бинарный код великое множество. Весьма разнообразные области человеческой деятельности автоматизируются. Если кто-то вынужден въедливо читать документацию на родном мне языке, обдумывая запятые - значит это с системой что-то не так.
89. termit@mail.ru 18.07.12 10:33 Сейчас в теме
Автор, респект. Подтверждаю: дотачивал обработку "Групповая обработка документов и справочников" в бухгалтерии для госучреждений (скорее всего аналогичное поведение и в стандартной бухгалтерии 2.0) на платформе 8.2
Столкнулся с тем, что после попытки повторно обработать документы они обрабатывались в неправильной последовательности. Массив для обработки там как раз отбирается этой функцией по полю "Пометка" исходной таблицы с отобранными для обработки документами. Стал копать - наткнулся на эту тему.
Так что:
1) люди(в т.ч. программисты 1с, т.к. это их обработка) всё-таки ожидают от этого метода правильный порядок строк
2) тема полезна, автору плюс
90. tango 494 18.07.12 10:38 Сейчас в теме
-: не просто "не тратить время", а вредная статья, курочащая мозги.
впрочем, проголосувавшим - барабан навстречу
91. fixin 4092 18.07.12 10:49 Сейчас в теме
(90) и в чем же ее вред? в том что показывает неявный глюк 1с?
(89) 1с - не для людей. Даже в документации не предупреждает об этом.
92. AleksR 98 12.10.12 14:44 Сейчас в теме
Статья полезная.

Добавьте только в функцию НайтиСтроки() строку:
Возврат М;

Кроме этого, можно было бы в статье написать, что данный способ можно использовать не только для таблиц значений, но и для табличных частей объектов. Только в случае табличной части в функцию ПослеНайтиСтроки() обязательно надо передавать вторым параметром ссылку на табличную часть, так как у её строки нет метода Владелец().
93. sergb1979 25.07.13 17:35 Сейчас в теме
При перепродажах использую аналогичное.
Чтобы номера строк не менялись.
97. AlexO 132 09.12.14 17:52 Сейчас в теме
(93) sergb1979,
Чтобы номера строк не менялись.

Каким образом у вас меняются "номера строк", если "номера строк" присваиваются при создании объекта (в данном случае это ТЗ)?
Т.е. как бы вы не тасовали записи, номера строк всегда будут по-порядку и от 1 до n-1 :))
А если имели ввиду "порядок строк", то к номерам строк это отношение не имеет. Точнее, порядок и определяет номера, но не наоборот.
Следовательно, либо вы:
- не писали некий механизм "При перепродажах использую аналогичное"
- не разобрались, как этот механизм "При перепродажах" работает (и обратили внимание совсем не на суть механизма, а на следствие - номера строк)
- не поняли, в чем суть проблемы рассинхронизации порядка.

98. fixin 4092 10.12.14 10:29 Сейчас в теме
(97) По-моемому в комментариях и статье тема уже достаточно раскрыта. Метод НайтиСтроки может вернуть строки не в том порядке, как они идут в таблице значений. В этом вся суть. Это недокументированная вещь, многим кажется, что порядок должен сохраняться. И это опасно. Об этом статья.
Оставьте свое сообщение

См. также

FormCodeGenerator Программная доработка форм. Часть 2 (Режим работы "Режим сравнения форм") на примере ERP 2.5 Промо

Практика программирования Адаптация типовых решений Прочие инструменты разработчика v8 1cv8.cf Абонемент ($m)

Данная публикация является продолжением описания функционирования обработки "FormCodeGenerator " в режиме сравнения форм и генерирования кода на основании сравнения. Подходит для перевода уже доработанных форм с интерактивной доработки на программную. Данный режим работы обработки снизит издержки при дальнейших обновлениях конфигураций.

5 стартмани

21.12.2020    9401    26    huxuxuya    11    

Интерактивная справка по объектам 1С (подключаемое расширение)

Практика программирования Работа с интерфейсом v8 ERP2 Абонемент ($m)

База знаний, подключаемая к объектам основной базы. Пополняется интерактивно, формируется в виде статей прямо в 1С (текст, картинки, таблицы, ссылки). Есть возможность прикрепления файлов, привязки к объектам 1С, возможности рейтинга и комментирования пользователями.

3 стартмани

29.09.2020    15140    76    sapervodichka    45    

Конвейер проверки качества кода

Инструментарий разработчика Практика программирования Математика и алгоритмы Jenkins SonarQube v8 1cv8.cf Абонемент ($m)

Jenkinsfile для выполнения проверки качества кода. Собирает информацию с АПК, EDT и BSL-LS. Сопоставляет ошибки с гит-репозиторием, выгруженным ГитКонвертором. Отправляет в Сонар.

3 стартмани

04.09.2019    37015    27    Stepa86    46    

Алгоритмы поиска пути в графе

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

Реализуем алгоритмы поиска пути в графе на платформе 1С 8.3, такие как алгоритм А*, поиск в ширину, жадный поиск, алгоритм Дейкстры и вконце волновой.

1 стартмани

09.07.2019    22907    12    RonX01    10    

Вам нравятся запросы в 1С? Промо

Практика программирования Разработка v8 v8::Запросы 1cv8.cf Абонемент ($m)

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    27921    7    m-rv    91    

Работа с публикациями "Инфостарт"

Практика программирования О сообществе WEB v8 УУ Абонемент ($m)

Работа с рублевыми публикациями на сайте "Инфостарт": ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.

1 стартмани

13.09.2018    28680    14    RocKeR_13    16    

HTTP Сервисы: Путь к своему сервису. Часть 3

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 2». В предыдущих частях мы использовали только Get, в этой части поговорим о других методах и длительных операциях.

1 стартмани

27.08.2018    54501    68    dsdred    17    

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    36445    31    informa1555    30    

ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар") Промо

Практика программирования v8 v8::Запросы 1cv8.cf Абонемент ($m)

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

1 стартмани

01.06.2018    36853    96    m-rv    58    

Работа с данными выбора

Практика программирования Работа с интерфейсом v8 Россия Абонемент ($m)

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

1 стартмани

17.07.2018    67060    25    kalyaka    17    

Полезные примеры составления схемы компоновки данных #2

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

Еще один набор примеров как решить частные задачи в СКД

1 стартмани

22.05.2018    40535    11    SITR-utyos    13    

Печатная форма, сделанная как расширение конфигурации для БП 3.0. Новые возможности БСП

Практика программирования Универсальные печатные формы v8 БП3.0 Абонемент ($m)

Печатные формы на внешних обработках скоро канут в лету. На смену им приходят ПФ, реализованные в виде расширений конфигурации. Не нашел на сайте примеров таких расширений. Привожу пример подобного расширения для БП 3.0.

1 стартмани

06.12.2017    33188    60    kwazi    6    

Заполняем по шаблону (по умолчанию) Промо

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

08.02.2018    34816    20    mvxyz    17    

Паузы при исполнении кода (Sleep для 1С)

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

28.11.2017    67933    18    swimdog    55    

Макет в СКД - пример всех возможных типовых вариантов

Практика программирования Инструментарий разработчика v8 v8::СКД 1cv8.cf Абонемент ($m)

Макет СКД: наглядное представление того, что, как и куда выводится при типовых настройках.

1 стартмани

09.11.2017    27508    81    freelancer    4    

Telegram-боты

Практика программирования v8 Абонемент ($m)

Описание теории, разбор архитектуры и пример реализации telegram-ботов. Сразу скажу, со структурированием изложения мало что могу поделать. :) редакция от 18.07.2018 Правки последней редакции выделены жирным.

1 стартмани

01.09.2017    42349    148    PLAstic    69    

Нечеткий поиск одним запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Использование механизма полнотекстового поиска в 1С не всегда оправдано, т.к. построение индекса и поддержание его в актуальном состоянии может значительно нагружать систему. Предлагаемая реализация нечеткого поиска методом N-грамм выполняется одним запросом, что позволяет производить поиск в любой таблице и не требует предварительного построения индекса.

1 стартмани

28.12.2015    34657    74    vasvl123    9    

Умный дом на 1С + ардуино

Практика программирования v8 Абонемент ($m)

Конфигурация для автоматизации быта программиста 1C и не только. В данной статье будет рассказано, как можно использовать 1С для задач, не входящих в стандартные рамки этой платформы. Например, управление домом. В качестве периферии для подключения будет использован микроконтроллер (МК) Ардуино, но на нём не будет никакой логической нагрузки, весь процесс будет проходить на сервере 1С. Работа с пинами ввода/вывода происходит напрямую из 1С.

1 стартмани

07.08.2017    28112    21    sasha777666    64    

Расширения конфигураций 1С: учимся перехватывать методы

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

В этой статье я на примерах разберу некоторые механизмы расширений конфигураций 1С. А именно «перехваты» методов модуля объекта и «перехваты» событий формы и элементов формы. Данная статья написана с учебными целями, чтобы показать, как при помощи расширений конфигурации можно делать такие доработки, ради которых раньше приходилось снимать конфигурацию с поддержки.

1 стартмани

30.05.2017    166245    13    signum2009    49    

Регулярные выражения – это просто. Построитель и отладчик регулярных выражений

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.03.2017    39080    123    romasna    52    

1С: Предприятие + корпоративный чат, как наладить оперативные уведомления за 10 минут Промо

Практика программирования v8 Абонемент ($m)

Как сделать автоматические уведомления о разных событиях из 1С в корпоративный чат MyChat для сотрудников компании

1 стартмани

14.08.2016    54991    36    Demanoidos    60    

Распознавание текста с помощью нейросетей Google Cloud Vision и 1С

Практика программирования v8 1cv8.cf Абонемент ($m)

Возможности Google Cloud Vision в распознавании текста.

1 стартмани

08.02.2017    38656    151    kiv1c    19    

Графическая схема. Управление при помощи XDTO.

Практика программирования v8 Абонемент ($m)

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

2 стартмани

16.01.2017    29386    127    Alxby    25    

Простой редактор плана помещения JavaScript

Практика программирования Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

На ресурсе сейчас очень много решений, которые позволяют редактировать карты, используя географические схемы. Так же много решений, которые позволяют редактировать объекты онлайн веб-карт. Мне же нужно было простое решение, для того чтобы расставить квадратные объекты на плане, показать их пользователю. Ну и распечатать, опять же. Я решил написать простенький редактор на JavaScript с использованием библиотеки Raphael.

1 стартмани

23.11.2016    27001    105    igel9780    23    

Быстрое определение интервалов в запросе Промо

Практика программирования v8 Абонемент ($m)

В статье описывается новый метод определения интервалов между данными различных записей в запросе. В отличие от общеизвестного метода, время работы предлагаемого метода зависит от объема данных ЛИНЕЙНО. Это обеспечивает ему значительный выигрыш по быстродействию на больших объемах данных. В качестве иллюстрации возможностей метода приведен отчет, показывающий гистограмму распределения времени между продажами.

1 стартмани

01.10.2015    60851    35    ildarovich    41    

Работа с двоичными данными на примере чтения файлов изображений. Новые возможности 8.3.9

Практика программирования WEB v8 1cv8.cf Россия Абонемент ($m)

В статье приводятся новые функции по работе с двоичными данными, появившимися в версии платформы 8.3.9 , на примере анализа формата и размера изображений. А также пример отправки изображения через API ВКонтакте с помощью новых объектов (без использования ОбъединитьФайлы())

1 стартмани

14.11.2016    34904    17    Anton64    24    

Загрузка файлов на сервер с прогрессом и докачкой

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Пример использования новых возможностей платформы 8.3.9 по низкоуровневой работе с двоичными данными для инкрементальной передачи файлов на сервер.

1 стартмани

04.10.2016    17274    57    mrstomak    21    

Несколько шаблонов для доработки типовых конфигураций

Практика программирования Инструментарий разработчика v8 v8::УФ Абонемент ($m)

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

1 стартмани

03.10.2016    41895    98    json    25    

HTTP-сервис: отчеты [Расширение]

Практика программирования Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Это HTTP-сервис, который возвращает почти любой отчет в HTML, XLSX или в JSON. Сохраните вариант отчета, получите на него ссылку и можно получить данные без захода в 1С. Работает в конфигурациях на основе БСП 2.3.3+, для отчетов на СКД и в 1С 8.3.8+

2 стартмани

30.08.2016    33871    154    Stepa86    16    

Недокументированное использование стандартных форм Upd.

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

Вам не хватает возможностей в платформе 1С или у Вас нет времени на углубленное изучение платформы 1С? Рассмотрены возможности использования стандартных форм, вызываемых из платформы.

1 стартмани

26.07.2016    33910    97    ZhokhovM    67    

Хранение файлов в томах на диске (для УПП 1.3)

Практика программирования v8 УПП1 Абонемент ($m)

Доработка типовой УПП 1.3 в плане хранения присоединенных файлов вне базы данных

2 стартмани

05.06.2016    67866    12    wowik    32    

БСП 2.3 и БСП 3.0: Просто про выполнение внешней обработки в фоне (c индикацией прогресса выполнения)

Инструментарий разработчика Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Простое пояснение о том, как сделать внешнюю обработку с фоновым выполнением и индикацией процесса для любой конфигурации на основе БСП 2.3.2. UPDATE 20/09/19: добавлен вариант обработки с индикацией процента выполнения и статусом выполнения для БСП 3.0.

1 стартмани

18.05.2016    74809    218    rozer    69    

Остатки на каждый день в запросе

Практика программирования Учет ТМЦ Учет ТМЦ v8 1cv8.cf УУ Абонемент ($m)

Запрос формирует остатки товаров на каждый день в пределах выбранного периода.

1 стартмани

26.04.2016    77289    21    arakelyan    25    

Еще один способ расчета остатков на каждый день в запросе

Математика и алгоритмы Практика программирования v8 Абонемент ($m)

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

1 стартмани

24.04.2016    40986    55    ildarovich    23    

Вывод печатных форм с запросом данных в форму "Печать документов" из подсистемы БСП "Печать".

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Все не раз видели, как в типовых конфигурациях, построенных на основе БСП (Библиотека стандартных подсистем), печатные формы, построенные на основе Табличного документа, выводятся в специальную форму "ПечатьДокументов". Эта форма входит в состав подсистемы "Печать" из БСП. При разработке своих печатных форм, иногда необходимо запросить у пользователя дополнительные данные необходимые для печати. Тут встает вопрос, как в этом случае вывести печатную форму в форму "Печать документа". В этой статье я рассмотрю, как реализовать вывод печатной формы в упомянутую форму из подсистемы "Печать", в случае если мы хотим перед выводом печатной формы запросить у пользователя дополнительные данные. Здесь будут рассмотрены два случая: когда реализуется печатная форма с использованием подсистемы "Дополнительные отчеты и обработки" и когда печатная форма добавляется в конфигурацию в режиме конфигуратора, т.е. вносятся изменения в типовую конфигурацию.

1 стартмани

29.03.2016    112271    220    lopatin    15    

Выполнение JavaScript кода из 1С в объекте Поле HTML Документа (HTML 5) и вызов события в 1С ПриНажатии

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Пример выполнения JS кода из 1С в Поле HTML Документа под управляемыми формами, с удобным получением результата в 1С(С помощью вызова привязанного события ПриНажатии к элементу ПолеHTMLДокумента)

1 стартмани

22.03.2016    95666    172    igo1    61    

Количество дней недели (понедельников/вторников/...) в заданном диапазоне одним запросом

Практика программирования v8 Абонемент ($m)

При реализации периодического авто-заполнения маршрутных листов по графику (недельному) необходимо было просчитать стоимость всего периода, с условием выездов только по определенным дням. Заморачиваться с обходом результата не хотелось. Пришлось написать "Небольшой" запрос.

1 стартмани

03.03.2016    23007    2    Alexander.Shvets    5    

Простые радости жизни программиста 1С: выбор типа значения

Работа с интерфейсом Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

17.02.2016    59272    56    yuraos    18    

Отображение прогресса выполнения длительных операций в БСП и их отладка в текущем сеансе.

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

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

1 стартмани

17.02.2016    69519    216    balanton    23    

Яндекс.Деньги "Благотворительность"

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Яндекс.Деньги теперь в 1С. Форма для приема благотворительных взносов. Форму легко сделать и вставить на любую страницу сайта или блога. Платежи будут приходить на ваш кошелек. На форме есть три способа платежа: из кошелька, с банковской карты, с баланса мобильного.

1 стартмани

16.02.2016    28379    8    Tatitutu    5    

Мастер рассылки e-mail 2.2 для управляемых форм

Практика программирования Email v8 v8::УФ ERP2 БП3.0 УТ11 Абонемент ($m)

Для пользователей: переделанный из старый разработки под 8.2 с использованием библиотеки Мастер рассылки e-mail 2.2 (ERP, УТ, БП) (Только управляемые формы), который теперь может запускаться под любой версией платформы с разрешенными или запрещенными модальными/синхронными вызовами в конфигурации. Также удобный выбор e-mail и их владельцев с помощью отбора динамического списка по любым критериям и галочки исключения.

1 стартмани

29.12.2015    46718    21    milkers    4