1с 77 посмотреть в отладке список значений

Обновлено: 06.07.2024

Список значений используется в двух случаях:

  1. При работе с формами: при размещении на форме элементов управления типа Список и ПолеСоСписком , они автоматически связываются с объектом типа СписокЗначений ;
  2. При работе с кодом: для хранения каких-либо расширяемых списочных данных вы создаете нужное количество объектов типа СписокЗначений ;

Хочется отметить, что объекты типа СписокЗначений не хранятся в информационной базе.

Создание списка значений

Как и все объекты агрегатного типа, список значений создается с помощью специальной функции СоздатьОбъект() встроенного языка:

Инициализация элементов списка значений

Каждый элемент списка значений характеризуется следующими свойствами:

По умолчанию, список значений создается пустым. Для добавления нового элемента списка значений, используется метод ДобавитьЗначение() объекта:

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

Манипуляция элементами списка

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

Вставка новых значений возможна в произвольное место списка. Для этого используется метод ВставитьЗначение():

Для получения значения элемента списка по номеру используется метод ПолучитьЗначение() объекта:

Удаление элементов списка производится с помощью метода УдалитьЗначение():

Интерактивные функции

Объект СписокЗначений имеет несколько методов, позволяющих взаимодействовать с пользователем. Например, с помощью метода ВыбратьЗначение() можно предложить пользователю выбрать одно из значений:

Также, можно предложить пользователю отметить одно или несколько элементов списка. Для этого используется метод ОтметитьЗначения(), который выводит список с пометками (checkboxes):

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

Перебор элементов списка значений

Для перебора (обхода) всех элементов списка значений обычно используется оператор цикла Для:

Форум

Создание объекта СписокЗначений

Список значений - это аналог одномерного массива в 1С, который предназначен для хранения и обработки промежуточных данных, возникающих в процессе работы программы. Объект "Список значений" имеет множество полезных возможностей и работает очень быстро. Следует учитывать, что в языке 1С есть и одномерные массивы в том смысле, как это принято в других языках программирования (Перем мас[10]). Список значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.

Добавление значений в список

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

СписокЗнач.ДобавитьЗначение("Иванов Иван Иванович");
СписокЗнач.ДобавитьЗначение(Сотрудник);
СписокЗнач.ДобавитьЗначение(1,"Значение №1");

СписокЗнач.УстановитьЗначение(3,3,"Значение №3"); //установить новое значение и представление 3-й позиции

Перебор списка значений

стр = "";
Для Номер = 1 По СписокЗнач.РазмерСписка() Цикл
. значение = СписокЗнач.ПолучитьЗначение(Номер, стр); //получить значение и представление
. Сообщить(значение + ", " + стр);
КонецЦикла;

Сортировка списка значений

//сортировать по значению
СписокЗнач.Сортировать(); //по возрастанию
СписокЗнач.Сортировать(1); //по убыванию

//сортировать по представлению
СписокЗнач.СортироватьПоПредставлению(); //по возрастанию
СписокЗнач.СортироватьПоПредставлению(1); //по убыванию

Поиск значения в списке

//поиск по значению
Синтаксис: НайтиЗначение(<Знач>)
Возвращает номер позиции списка, в которой найдено значение или 0, если не найдено

номстр = СписокЗнач.НайтиЗначение (Сотрудник);

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

Если СписокЗнач.Принадлежит(Сотрудник)=1 Тогда
. <действия>
КонецЕсли;

Удаление значений из списка

СписокЗнач.УдалитьВсе(); //очистить список значений

//удаляет значения из указанной позиции
СписокЗнач.УдалитьЗначение(откуда, [сколько]);

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

//установить курсор на указанную строку или можно узнать, где находится курсор.
ТекСтрока = СписокЗнач.ТекущаяСтрока(НовСтрока);

//список значений в диалоге может иметь пометки (флажки)

пометка = СписокЗнач.Пометка(Позиция); //прочитать пометку у значения списка
СписокЗнач.Пометка(Позиция,1); //установить пометку у значения списка
СписокЗнач.Пометка(Позиция,0); //снять пометку у значения списка

Выгрузка и загрузка списка значений

//выгрузка в другой список значений или таблицу значений
Синтаксис: Выгрузить(<Знач>,<НачПоз>,<Колич>)
СписокЗнач.Выгрузить(НовыйСписок,1,10); //выгрузить первые 10 значений

//выгрузка списка значений в строку с разделителями
стр = СписокЗнач.ВСтрокуСРазделителями(); //возвращает строку: 10,12,"Иванов","Петров"

//загрузка списка значений из строки с разделителями
//обратите внимание на двойные кавычки для строковых значений
СписокЗнач.ИзСтрокиСРазделителями("10,12,""Иванов"",""Петров""");

Те, кто хоть раз работал с отладчиком VBA, мечтают о том, чтобы и в 1С можно было изменять значения переменных и переходить на любую точку кода.

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

Применение этих функций основано на том, что в табло отладчика в режиме Конфигуратора или 1С:Предприятия можно вызывать доступные в контексте точки останова функции. Примеры нужно вводить в табло Ctrl+Alt+W или в окно просмотра значения выражения Shift+F9 и сразу же получать результат.

Функция ДУ

Эта функция позволяет в любой момент выполнить любой код на языке 1С над любыми данными, переданными ей.

Примеры:
= Сообщает некий текст

= Присваивает переменной Отказ значение истина

= В отладчике нельзя вызвать процедуру, но можно это сделать через ДУ:

Функция Присвоить

Всем известно, что в 1С80 нельзя по хоту отладки менять значения переменных.
Однако есть выход!
В общем модуле объявите функцию:

Теперь вы можете в любой момент присвоить значение переменной.

Отладка в типовой конфигурации

А что же делать, если вам досталась отладка конфигурации, в которой нет этих замечательных функций?

Все очень просто. Создайте внешнюю обработку, занесите в ее модуль эти функции с ключевым словом экспорт и вызывайте их например так:

Манипуляции со стеком.

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

Нужно открыть окно стека (Ctrl+F3), перейти на нужны уровень и ввести в табло имя переменной.
Лучше всего это рассмотреть на примере рекурсивной функции:

Поставьте в этой функцию точку останова и вы увидите что на разных уровнях стека переменная А принимает разные значения.

Прерывание работы программы

К сожалению, в 1С 80 можно прекратить работу некоторого кода только прекратив работу всего 1С:Предприятия. Так сказать, для борьбы с головной болью нужно отрубить голову. :)
Но не все так плохо.

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

Теперь, как только выполнение кода дойдет до строки с "Если", возникнет ошибка и выполнение прекратится.

Упреждающий просмотр

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

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

Изменение кода на лету

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

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

Маялись мы маялись, а потом придумали - все вызовы Выполнить были вынесены в одну функцию, куда передавался код для выполнения и параметры. Это нам и сослужило хорошую службу.

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

Отладка на сервере

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

Условная точка останова

Не все знают, что в 1С 80 есть условная точка останова - точка останова по условию. Однако это очень полезный механизм.

Трассировка

Для этих целей в 1С можно использовать условную точку останова, т.к. условие проверяется на каждом проходе кода через условную точку останова.

На указанной строке ставим точку останова с условием:

Сумма:1
Сумма:3
Сумма:6
Сумма:10
Сумма:15
Сумма:21
Сумма:28
Сумма:36
Сумма:45
Сумма:55

Управление кодом

Предположим у нас есть такой код:

В таком случае мы можем применять программное управление кодом.
На начале оператора Если ставим условную точку останова:

Т.е. если А=1 то мы присваиваем А значение 2, и присваиваем 1 в противоположном случае.
Это позволяет, не меняя конфигурацию, постоянно перенаправлять код на нужную нам ветку.
Можно просто поставить условную точку останова, которая будет присваивать А нужное значение:

Обозримая трассировка

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

Если трассировка временно не нужна, ее нужно убрать так:

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

Более простой вариант для ленивых - в табло написать вычисление выражений (например с помощью ДУ), которые откроют нужные документы и журналы. Легко и быстро!

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

Отладка клиент-серверной базы

Использование внешней обработки


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

Подсовывание тестовых данных


Иногда в базе сложно получить пример, при котором выполняется некое экзотическое условие.
В таком случае проще подсунуть тестовые данные.
Например, если в коде обрабатывается некоторая таблица значений, можно прямо в коде прописать очистку этой таблицы значений и заполнение ее новыми данными, при которых выполняется это экзотическое условие.
Для тех, кто не любит портить код ради отладки, можно посоветовать с помощью функции ДУ вызвать внешнюю обработку, которая заполнит таблицу значений как нам надо (например считает ее из макета).

Отладка блокировок

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

Если такая отладка вызывается часто, рекомендую такой способ вызова сразу двух сессий 1С.
Из отладчика нажимаете F5 (Запустить отладку), запускается 1С:Предприятие. Отключаетесь от отладки этого 1С Предприятия - "Отладка"->"Отключиться", затем еще раз нажимаете Ф5. В итоге вторая сессия у вас подключена к отладчику. Запускаете код с предупреждением в первой сессии и отлаживаетесь во второй.

Ускорение отладки

Отладчик снижает скорость работы программы.
Поэтому можно поступить так - отключить отладчик, а в нужном месте вывести Предупреждение();
Когда выведется предупреждение, можно опять подключить отладчик, поставить точку останова и начать отладку.

Не секрет что в 1С 7.7 Ужасно реализован отладчик.
Нет такой маленькой, но весьма нужной возможности,
просматривать список значений и таблицу значений как в 1С 8х.

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

Сам пользуюсь этой обработкой. Гдето скачал, и немного подправил).

В отладке очень помогает. Помещаю саму обработку в каталог бд\ExtForms и вызываю ее с переданным СЗ или ТЗ вот так:

ОткрытьФорму("Отчет", ТЗ, КаталогИБ()+"\ExtForms\ПоказатьТаблицуЗначений.ert");

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

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

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

могу порекоментовать для тех,
кто не боится изменять конфигурацию:

В отладчике пишешь выбрать строку - и вуала таблица на экране
+(3) ВыбратьЗначение(. ) для списка
публикация, несомненно, вредная, но мне какое дело? так что обойдемся без минусов

Ну для ТЗ :
ВыбратьСтроку(<?>,,);
Синтаксис:
ВыбратьСтроку(<Строка>,<Заголовок>,<Таймаут>)
Назначение:
Открыть окно для интерактивного выбора строки в таблице значений.
Возвращает число: 1 - если выбор произведен (нажата кнопка ОК); 0 - если выбор не произведен (нажата кнопка ''ОТМЕНА''); -1 (минус единица) - закончилось время <Таймаут> ожидания отклика пользователя.
Параметры:
<Строка> - необязательный параметр. Идентификатор переменной, куда помещается значение - номер выбранной строки. При вызове метода здесь можно передавать значение

А для СЗ:
ВыбратьЗначение(<?>. )
Синтаксис:
ВыбратьЗначение(<Значение>,<Заголовок>>,<Позиция>,<Таймаут>,<СпособВыбора>)
Назначение:
Открыть окно для интерактивного выбора значения из списка.
Возвращает: -1 (минус единица) - закончилось время <Таймаут> ожидания отклика пользователя, 1 - если выбор произведен, 0 - иначе.
Параметры:
<Значение> - идентификатор переменной, куда помещается результат выбора;
<Заголовок> - строка заголовка диалогового окна.
<Позиция> - идентификатор переменной, куда помещается номер позиции выбранного значения в списке.
<Таймаут> - необязательный параметр. Числовое выражение, значение которого задает время ожидания системы (в секундах) на отклик пользователя.
<СпособВыбора> - необязательный параметр. Число, значение которого задает способ выбора значения. 0 - в виде диалога; 1 - выбор производится в виде меню, которое подстраивается по месту текущего элемента диалога или ячейки таблицы; 2 - выбор маленьким списком (список похож на выбор значения перечисления), также привязанным к позиции элемента диалога
Значение по умолчанию - 0.
Замечание:
Метод может использоваться только для переменных, созданных функцией СоздатьОбъект.

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

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

список точек останова

Запуск отладки в 1С

запуск отладки

Отладка фоновых заданий 1С

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

Включение отладки фоновых заданий и внешних соединений

В этом окне Вы можете установить соответствующий флаг.

Установка точки останова (брейкпойнта)

открытие обработчика

Для того чтобы установить точку останова, необходимо найти нужный программный код и кликнуть дважды на поле, слева от поля ввода кода (или нажать кнопку F9):

установка точки остановки

спиоск активных точек останова

Точка останова 1С с условием (синяя)

Например, остановим цикл на строке с номером 25:

точка останова с условием 1с

Неактивная точка останова (серая)

серая точка останова

Точка останова по ошибке

остановка по ошибке

Пошаговое перемещение по программному коду 1С

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

активация отладки

Чтобы перейти с текущего положения курсора к нужному, минуя промежуточные строчки кода, необходимо установить курсор на нужной строке и нажать shift + F10 (Идти до курсора).

Анализ значений в режиме отладки 1С

Посмотреть значения определенных значений можно разными способами:

Отображение значения при наведении курсора

отображение значения переменной курсором

вычисление выражения

Очень полезно использовать вычисление выражения и выполнить запрос, выгрузить в таблицу значений и посмотреть её.

С помощью него Вы можете подробно узнать, откуда была вызвана процедура и с какими параметрами:

стек вызовов

Смотрите также обзорное видео по отладке в 1С:

Другие статьи по 1С:

Читайте также: