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

Публикация № 982008

Администрирование - Тестирование и исправление

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

1) Получение конкретного места и номера строки возникновения исключения.

1.1) Через установку настроек отладки

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

Например, при открытии документа «Реализация Товаров и услуг» возникает следующая ошибка:

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

Многие разработчики также знают, что когда они из конфигуратора запускают отладочный режим в случае возникновения исключения система помимо кнопки Ок, выводит также и кнопку Подробно.

При нажатии на кнопку «Подробно…» можно получить информацию о точном месте возникновения ошибки.

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

Что для этого надо сделать?

Все очень просто. Необходимо сначала зайти через пункты Главное меню (пиктограмма со стрелкой в верхнем левом углу экрана) – Сервис –Параметры.

И в открывшемся окне значение параметра «Отладка в текущем сеансе:» установить в значение «Разрешена (протокол TCP/IP)».

Вот и всё.

Воспроизведем теперь ошибку и Вуаля!) Доступна кнопка "Подробно..."!

 

1.2) Получение данных об ошибке через форму информации для технической поддержки.

Спасибо Bonv, он подсказал еще способ, требующий даже еще меньше телодвижений.

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

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

 

 

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

2) Переопределение значений переменных, свойств объектов, параметров прямо во время отладки.

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

Начиная с 8.3.7 платформа 1С стала предоставлять такую возможность.

Например, у Вас существует документ, у которого в событии «При создании на сервере» выполняется масса всяких проверок, в которых выполняется контроль на наличие специальных ролей, каких-то доп. свойств у текущего пользователя, контроль закрытого периода.

В результате форма при открытии недоступна для изменения, а Вам необходимо срочно выполнить для проверки какие-то интерактивные действия. Как быть?

Запускаем отладчик и устанавливаем точку останову в самом конце процедуры ПриСозданииНаСервере

Срабатывает точка останова, теперь просмотрим значение свойства формы ТолькоПросмотр.

Для этого перейдем к окну вычисления выражения (Отладка – Вычислить выражение) или Shift + F9.

 

В открывшемся окне в поле выражения пропишем свойство формы ТолькоПросмотр и нажимаем Enter или Рассчитать.

Мы видим, что действительно свойство формы «ТолькоПросмотр» установлено в значение Истина. Мы можем это исправить.

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

В открывшемся окне вводим Ложь и нажимаем кнопку «Установить».

Появляется сообщение об успешном изменении значения.

Вот и всё! Форма доступна для изменения.

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

Возможно переопределять и значение Параметров.

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

Процедура ПодразделениеНачалоВыбора (Элемент, ДанныеВыбора, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    ОбработатьНачалоВыбораПодразделения();

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

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

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

 

 

3) Просмотр временных таблиц запроса.

3.1) Возможности при использовании платформы 8.3.8 и выше.

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

Рассмотрим два варианта:

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

Перейти к окну Выражения («Отладка» –> «Вычислить Выражение»… или Shift + F9).

В открывшемся окне в поле Выражение прописываем:

Запрос.ВыполнитьПакетСПромежуточнымиДанными()

И нажимаем «Рассчитать».

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

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

Запрос.ВыполнитьПакетСПромежуточнымиДанными()[1].Выгрузить()

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

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

 

 

 

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

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

В окне Результата отобразиться значение специального типа ВременныеТаблицыЗапроса.

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

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

 
МенеджерВТ.Таблицы[1].ПолучитьДанные().Выгрузить() //Обращение по индексу 1. Не забывайте что индексы ведут счет с 0, поэтому мы получим вторую по счету таблицу в пакете.
МенеджерВТ.Таблицы["ВТ_Подразделения"].ПолучитьДанные().Выгрузить() // Обращение по имени временной таблицы "ВТ_Подразделения"

 

3.2) Просмотр содержимого временных таблиц в версиях платформы ниже 8.3.8

Если же Вы работаете с версией платформы ниже 8.3.8, то не стоит сильно печалиться)

Можно реализовать альтернативный вариант в своей конфигурации.

Для этого необходимо в общем модуле создать следующую процедуру:


Функция СодержимоеВременнойТаблицы(МенеджерВременныхТаблиц, ИмяВременнойТаблицы) Экспорт 
	
	Запрос = Новый Запрос; 	
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.Текст = "ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы; 
	
	Возврат Запрос.Выполнить().Выгрузить(); 
	
КонецФункции

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

Например, если общий модуль, в котором Вы прописали функцию СодержимоеВременнойТаблицы, называется Расчеты, переменная с менеджером временных таблиц - МенеджерВТ, а имя временной таблицы - ВТ_Сотрудники, то необходимо прописать следующее выражение:

Расчеты.СодержимоеВременнойТаблицы (МенеджерВТ, "ВТ_Сотрудники")

Либо если менеджер временных таблиц установлен для запроса с именем Запрос:

Расчеты.СодержимоеВременнойТаблицы (Запрос.МенеджерВременныхТаблиц, "ВТ_Сотрудники")

В результате Вы получите таблицу значений с содержимым временной таблицы!

 

 

Спасибо за уделенное время и внимание моей статье!

 Надеюсь, она Вам пришлась по душе и хоть чему-то да научила) Если статья оказалась полезной, не забываем плюсовать её)

182

См. также

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

Комментарии
Избранное Подписка Сортировка: Древо
1. gradi 4 17.01.19 13:34 Сейчас в теме
Спасибо. Действительно полезные советы.
PoZiTiFFF; +1 Ответить
12. PoZiTiFFF 484 17.01.19 22:19 Сейчас в теме
(1)Рад, что статья оказалась полезной и помогла кому-то заполнить пробелы в знаниях.
2. FesenkoA 33 17.01.19 14:00 Сейчас в теме
ВыполнитьПакетСПромежуточнымиДанными()


Платформа
Платформа 1С v8.x (все механизмы)


напишите для каких платформ актуальны эти механизмы. Первый например тянется ее с 8.2, второй не помню, а последний на 8.3.9
PoZiTiFFF; +1 Ответить
15. PoZiTiFFF 484 18.01.19 00:35 Сейчас в теме
(2) Возможность работы с Таблицами менеджера временных таблиц и метод ВыполнитьПакетСПромежуточнымиДанными() появились в версии платформы 8.3.8
Возможность динамически переопределять значения переменных - с версии 8.3.7

Добавил эту информацию в статью. Более того, прописал как с помощью функции общего модуля можно получать содержимое временных таблиц в версиях платформы младше версии 8.3.8.
3. VictorRGB2 9 17.01.19 14:10 Сейчас в теме
рекомендую очень осторожно пользоваться советом №2 и не применять его (или стараться свести к минимуму) в рабочей базе, т.к. в некоторых случаях измененное значение замечательно присваивается объекту не только в режиме отладки, но и остается измененным после, что может привести к непредсказуемым последствиям.
14. PoZiTiFFF 484 18.01.19 00:10 Сейчас в теме
(3)Согласен. Но мне кажется в конфигураторе рабочей базы вообще всегда надо быть осторожным и не совершать непонятных или неосмысленных действий.
Тем более меняя какие-то значения в системе, мы фактически нарушаем реализованный, прописанный в системе алгоритм, заложенную логику. Так что действительно - пользоваться можно, но осторожно) С умом.
16. tormozit 5016 18.01.19 00:54 Сейчас в теме
(3) Инспектор объектов отладчика не копирует объекты (работает с оригиналами). Поэтому все изменения свойств объектов сразу применяются. Поэтому некорректно писать "в некоторых случаях" (правильнее будет написать "всегда").
18. VictorRGB2 9 18.01.19 09:20 Сейчас в теме
(16) я имел в виду случай, когда человек забыл вернуть обратно исходное значение, но да, вы правы, выразился не точно
4. login1020 17 17.01.19 14:43 Сейчас в теме
По поводу просмотра временных таблиц уже была статья
https://infostart.ru/public/822287/
Там много что дельного в комментариях по этому поводу:

Обращение по индексу временной таблицы

Запрос.МенеджерВременныхТаблиц.Таблицы[Индекс].ПолучитьДанные().Выгрузить()


Обращение по имени временной таблицы

Запрос.МенеджерВременныхТаблиц.Таблицы.Найти(<Имя временной таблицы>).ПолучитьДанные().Выгрузить() 


Отладочная функция

Функция ПросмотрВТ(Запрос, ИмяВременнойТаблицы) Экспорт

 ЗапросТМП = Новый Запрос("ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы);
 ЗапросТМП.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
 Возврат ЗапросТМП.Выполнить().Выгрузить();

КонецФункции
Rustig; Vladimir Litvinenko; +2 Ответить
5. Vladimir Litvinenko 17.01.19 15:12 Сейчас в теме
Строку кода, вызвавшую исключение, можно увидеть в журнале регистрации. Предложенный способ поможет в случае, если нет доступа к журналу регистрации (например он отключен) или если ошибка воспроизводится на компьютере, где установлен толстый клиент и можно сразу зайти в конфигуратор.

Порекомендую еще очень хорошее видео по этой же теме. Много интересных приёмов продемонстрировано :
https://www.youtube.com/watch?v=y098oG9XT98
tommadm; Rustig; jif; genayo; +4 Ответить
26. herfis 272 18.01.19 14:52 Сейчас в теме
(5)
Строку кода, вызвавшую исключение, можно увидеть в журнале регистрации.

Не всегда, к сожалению. Правда, не уверен что в этих случаях спасут и предложенные методы. Буду посмотреть.
6. SerVer1C 156 17.01.19 15:39 Сейчас в теме
Вы уверены, что 1с-хак №1 сработает при выключенной отладке на сервере ?
8. Darklight 18 17.01.19 16:01 Сейчас в теме
(6)Да, никаких проблем быть не должно. Данный пункт управляет только отладкой на клиенте!
PoZiTiFFF; +1 Ответить
7. bonv 644 17.01.19 15:55 Сейчас в теме
(0) По п.1
Просто идем в "О программе..." и далее "Информация для техподдержки", там и будет подробная информация об исключении
disa_da; markers; user811626; Zergil; +4 Ответить
17. PoZiTiFFF 484 18.01.19 09:10 Сейчас в теме
(7) bonv, спасибо за предложенный вариант. Добавил информацию в статью.
9. Darklight 18 17.01.19 16:18 Сейчас в теме
Эх.... ждать нам встроенную в платформу фичу для быстрого обращения в тех поддержку - видимо вечно :-( А всего-то надо было сделать у корня конфигурации доп. свойство "ФормаОбращенияПоТехподдержку" и встроить в окно с системной ошибкой кнопку - "Техподдежка", открывающую данную форму (которая будет назначена в конфигурации для этих целей) и передающая туда объект ИнформацияОбОшибке.

Конечно, в идеале, ещё и значение, на котором возникла ошибка (например при попытке вызвать метод у переменной примитивного типа), и значения объекта контекста, в котором произошла ошибка (например ЭтотОбъект - значение типа "ФормаКлиентскогоПриложения", а ещё ДополнительныеСвойстваОтладки - которые программист может заранее задать для некоторого контекста выполнения - поместив туда всё что угодно); а ещё круто было бы - если бы туда ещё и автоскриншот окна приложения передавался.
Ну это в идеале.

Всё - а далее уже конфигурация пусть сама определяет такую форму и её функционал (ну, опять-таки, в идеале, хорошо бы чтобы и в платформу была встроена хоть-примитивная форма обращения в техподдержку - позволяющая направить сериализованне вышеупомянутые данные (+ номер сеанса и имя пользователя, строку соединения ИБ и дату события) на указанный e-mail адрес, и сохраняющая их в Ж/Р для анализа; а ещё можно преднастроить для ней web-сервис, который она может взывать и передавать данные туда; но это так для галочки - тут, конечно, надо в конфигурации свою форму делать под себя; ну в типовых тоже должна быть своя форма - чтобы и во Фреше ей удобно можно было пользоваться, и самостоятельным компаниям с нетребовательной техподдержкой тоже её использовать для своего информирования).

Вот это было бы круто! А главное - плёвое дело то, такой функционал замутить-то, разработчикам платформы (и далее разработчикам конфигураций). Но в компании 1С не всё для людей.... тем более для программистов делается! :-(
Denium79; Dimasik2007; mivari; PoZiTiFFF; +4 Ответить
20. Rustig 1072 18.01.19 10:55 Сейчас в теме
(9) а если ошибка в собственных доработках возникнет? то есть не в типовом функционале.
а если ошибка не в алгоритмах, а кривых данных?
я думаю, разработчики типовых решений и платформы защитили себя от подобного спама, просто не реализовав вашу идею. ;)
22. Darklight 18 18.01.19 13:34 Сейчас в теме
(20)Не понимаю сути претензий! Причём здесь собственные алгоритмы и защита разработчиков 1С?

Я говорю об универсальном решении обращения в техподдержку. А уж кто оказывает её - такому решению должно быть побарабану - что будет настроено туда и будет отправлять! Я даже предложил так, чтобы в самих конфигурациях можно было бы (и нужно было бы) свою форму для обращения в техподдержку подключать (где уже можно было реализовать любые "извращения"; кстати, как вариант - иметь возмоджность переопределить форму из конфигурации, формой из внешней обработки - но это уже тонкости конфигурирования самой формы, а не платформы). А платформенная форма - просто могла бы брать данные настроек из общего ХранилищаНастроек чтобы определить e-mail адрес по умолчанию (куда отправлять, которые пользователь мог бы изменить), параметры доступа к почтовому аккаунту для отправки (или, как альтернативный, вариант создавать письмо через почтовый клиент ОС по умолчанию), web-сервис для передачи данных в специальное автоматзированное ПО (любое это к решению не относится), и телефон техподдержки. Это всё (или часть) можно было бы указать при настройке ИБ (да ещё и с разделителями данных - для фреша): получателем будет либо своя IT-служба, либо поддержка франча (в т.ч. бухофон, или как он там сейчас называется), либо поддержка сопровождения фреш-решения в облаке. Но никак не сама компания 1С. Туда уже информация об ошибке может быть переслана вышеуказанными получателями(службами), по существующие и сейчас схеме обращения регистрации ошибок платформы
Denium79; dock; PoZiTiFFF; +3 Ответить
24. Rustig 1072 18.01.19 14:18 Сейчас в теме
25. Darklight 18 18.01.19 14:52 Сейчас в теме
(24)Ну, надеюсь теперь ещё и с лучшим пониманием того, чего мне так хочется ;-) а хочется мне чтобы этого хотелось подавляющему числу пользователей платформы 1С Предприятие 8, и уж тем более хотелось её архитекторам!
10. Ibrogim 1046 17.01.19 16:29 Сейчас в теме
11. Synoecium 560 17.01.19 18:45 Сейчас в теме
Новым для меня оказалась только настройка разрешения отладки для вывода подробностей об ошибке, раньше отладку в конфигураторе запускал, теперь буду знать. Спасибо за подсказку.
user633910_yagee12; PoZiTiFFF; +2 Ответить
13. PoZiTiFFF 484 18.01.19 00:04 Сейчас в теме
(11) Собственно главный акцент в статье и был сделан на эту часть. Это видно и по заголовку) Изначально даже планировалось и статью написать только на эту тему, но уже в процессе решил добавить описание еще двух довольно часто используемых мною весьма ценных плюшек, о которых многие всё-таки не знают.
19. Rustig 1072 18.01.19 10:52 Сейчас в теме
зачастую пользователи клиента звонят, говорят об ошибке, при подключении ошибка не воспроизводится. теперь можно просить их высылать информацию для технической поддержки из окна "О программе". Испытаю данный способ! Возьму на вооружение.
PoZiTiFFF; +1 Ответить
21. androgin 18.01.19 12:56 Сейчас в теме
С чего вдруг после нового года стали постить подобное?
Уже третья статья с "лайфхаками" ))))
Если автор не умеет пользоваться отладчиком или не в курсе как запускать сеанс с отладкой (а 1С этому учит и полно этого в сети), то наверно автору нужно еще поучиться самому
23. echo77 1067 18.01.19 14:08 Сейчас в теме
(21) Статьи заостряют внимание других участниках сообщества на теме. Кто-то уже знает. Кому-то эта информация попадется на глаза и будет полезна.
Torin57; Pete; PoZiTiFFF; +3 Ответить
27. AlX0id 18.01.19 15:26 Сейчас в теме
(21)
Надо пойти запостить лафх*йак - как посмотреть, какой код выполняется при открытии формы %) чую, нарублю звезд выше крыши
28. PoZiTiFFF 484 18.01.19 20:44 Сейчас в теме
(21)

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


Вы статью вообще читали?
Причем здесь пользоваться отладчиком, при чем здесь запуск сеанса с отладкой?

Статья учит как получить моментально полную информацию об ошибке от пользователей без запуска конфигуратора, без обращения к журналу регистрации. И это в некоторых случаях действительно очень помогает.
Иногда лучше промолчать, чем сказать глупость.
29. androgin 19.01.19 01:24 Сейчас в теме
(28) Именно читал. Статья для "первоклашек"!
Обычный программист без опыта и то должен уметь находить ошибки и знать как их получать на клиенте и в отладчике конфигуратора.
Это в принципе его работа!
Ну и можешь минусовать сколько влезет - я не ведусь на поведение обиженных девочек в песочнице
30. PoZiTiFFF 484 19.01.19 05:04 Сейчас в теме
(29)
Обычный программист без опыта и то должен уметь находить ошибки и знать как их получать на клиенте и в отладчике конфигуратора.
Это в принципе его работа!

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

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

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

Больше вести с Вами диалог не вижу смысла, в связи с чем дальнейшие Ваши сообщения буду игнорировать. Удачи!
klinval; Torin57; MRAK; Pete; tommadm; +5 Ответить
36. Torin57 7 24.01.19 13:59 Сейчас в теме
(29) Я тоже так раньше думал. Жизнь заставляет пересмотреть свои взгляды. Да, можно подходить к обучению со всей серьезностью, копаться в документации, читать описание изменений к платформе, пойти на очные курсы по 1С в Учебном центре №1. Это малоэффективно. Чтение таких статей для "чайников" - самый эффективный путь обучения для новичка. Проблема в том что без практики теория не дает должного понимания. Статья небольшая, ее можно применить на практике. Как раз то что нужно.
PoZiTiFFF; +1 Ответить
31. PerlAmutor 33 19.01.19 15:51 Сейчас в теме
Плохо, что в платформе нет расширенной ошибки с некоторым уровнем вложенности стека. Вот что мне дает информация о том, что ошибка возникла в общем модуле БСП на строке номер такая-то и функция ЗначениеРеквизитаОбъекта() ? Да эта функция вызывается из огромного числа мест, мне важно знать кто её вызвал, а не то, что она не справилась с поставленной задачей по причине косячного значения переданного параметра.
33. Darklight 18 21.01.19 10:34 Сейчас в теме
(31)Согласен, данного функционала тоже не хватает!
32. fzt 21.01.19 04:48 Сейчас в теме
2) Переопределение значений переменных, свойств объектов, параметров прямо во время отладки.

Мне удобней так (сразу оговоримся что я работаю почти 100% времени с переписанными конфигами).
Где-то в общем модуле создать функцию типа:
Функция П(А,Б) Экспорт
А = Б;
Возврат А;
КонецФункции;

В модуле допустим "О" - Отладочный

Тогда изменение значений можно делать быстрее, быстро набрал в строке
О.П(Отказ,Ложь)
и вся недолга.

Набрать проще сразу в редакторе кода и нажать Shift +F9, если строка окажется годной то она там и останется, после отладки убрать вызовы или regexp`ом заменить. Если объект не снят с поддержки то сперва Shift+F9 потом замена по рассчитать.
Действительно быстрее и никаких лишних телодвижений, только горячие клавиши и никакой мышки.

Ещё насколько помню отладчик не даст присвоить значение какой-то функции, а П() запросто.
PoZiTiFFF; +1 Ответить
34. Danilov 22.01.19 05:26 Сейчас в теме
Спасибо. Полезные советы.
PoZiTiFFF; +1 Ответить
35. Arikite 23.01.19 19:59 Сейчас в теме
Большое спасибо!
Полезная статья
PoZiTiFFF; +1 Ответить
37. user_2010 352 24.01.19 14:12 Сейчас в теме
Спасибо, что поделились сокровенными знаниями! :) Полезно очень!
PoZiTiFFF; +1 Ответить
38. AndreyKnife 3 24.01.19 20:28 Сейчас в теме
Полезная статья, добавил себе. Спасибо)
PoZiTiFFF; +1 Ответить
Оставьте свое сообщение