30 задач. Странных и не очень

02.12.19

Разработка - Математика и алгоритмы

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

Цель статьи

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

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

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

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

А все что ниже - это больше для веселья!

Среда выполнения

Весь продемонстрированный далее код выполнялся на платформе 1С версии 8.3.13.1690 в клиент-серверном варианте работы, управляемые формы. Никаких особых настроек не выполнялось. Обычно код задачи делится на клиентский и серверный. Можете вставить фрагмент в управляемую форму и разбить процедуры и функции по контексту выполнения с помощью директив "&НаКлиенте" и "&НаСервере".

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

В общем, ничего особенного. Просто берете и делаете :)

Задачи

Хватит болтать, пора действовать!

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

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

 
 Задачи с 1 по 10
 
 Задачи с 11 по 20
 
 Задачи с 21 по 30

Так много кода! Так много задач! И так мало ответов!

Вам слово

Прошли весь путь и не нашли ответов? Все так. Думаю, нет смысла давать ответы на задачи, которые легко проверить в конфигураторе. Надеюсь, я смог хоть немного Вас запутать и улыбнуться.

 
 Небольшой комментарий от автора

Если в Ваших "чертогах разума" также есть интересные задачки или комментарии по задачам из статьи, то добро пожаловать в комментарии!

P.S. Лайк, репост, подписка!

Другие ссылки

Похожих тем не нашел, но если подскажите, то добавлю сюда.

Авторские разработки

программирование задачи проверка тестирование знания практика загадки головоломки баг фича

См. также

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6396    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18465    SeiOkami    46    

118

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8802    YA_418728146    6    

141

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15972    SeiOkami    31    

103

Расширение глобального поиска 1С, или Глобальный поиск "на максималках"

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Мало кто знает, что поле "Глобального поиска" в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.

27.03.2023    6944    SeiOkami    10    

140

Версионирование объектов VS История данных

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    18926    dsdred    54    

191

Практическая шпаргалка по новым возможностям языка запросов 1С

Механизмы платформы 1С Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

21.11.2022    23415    quazare    36    

122

Шпаргалка по функциям АСИНХ

Механизмы платформы 1С Платформа 1С v8.3 Россия Бесплатно (free)

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

29.07.2022    41793    zeltyr    23    

194
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
7. DoctorRoza 02.12.19 09:46 Сейчас в теме
Автору спасибо! Порадовал!
maksa2005; Leon75; ASKiselev; kuzyara; YPermitin; +5 Ответить
8. пользователь 02.12.19 10:51
Сообщение было скрыто модератором.
...
9. dhurricane 02.12.19 11:35 Сейчас в теме
Не ожидал, конечно, подвоха в 15-ом задании. :-) Вы специально написали в словах букву "е" латиницей и кириллицей?
10. пользователь 02.12.19 11:38
(9) да. Вот только подсветка синтаксиса на ИС меня выдает :)))
11. dhurricane 02.12.19 11:40 Сейчас в теме
(10) Сколько не глядел, не увидел разницы. Только отладчик подсказал.
12. пользователь 02.12.19 11:42
(11) тогда я рад, что не сделал вашу жизнь проще :)))))
Free1CforAll; acanta; +2 Ответить
13. Quantum81 6 02.12.19 13:10 Сейчас в теме
Супер!
Показывает как мы все любим отладчик. Такая инфа в голове вообще не держится :(
davdykin; YPermitin; +2 Ответить
14. пользователь 02.12.19 13:27
15. sergvagner2018 02.12.19 14:07 Сейчас в теме
(0) Как-то я приуныл после задач :))
YPermitin; acanta; +2 Ответить
16. herfis 498 02.12.19 14:18 Сейчас в теме
Думаю, нет смысла давать ответы на задачи, которые легко проверить в конфигураторе.

Как это нету? Я готов заплатить старманю, просто чтобы не тратить время на проверку своих ожиданий.
Самому проверять лениво :)
burni4; maksa2005; TreeDogNight; davdykin; YPermitin; PLAstic; +6 Ответить
17. пользователь 02.12.19 14:21
(16) возьмите себя в руки :)

Да просто это будут нудные ответы. Такле за стартмани стыдно отдавать.
19. PLAstic 295 02.12.19 16:35 Сейчас в теме
(17) Вот-вот, уже прямым текстом говорят, что чтобы оставить позитивное впечатление, даже за баксы готовы узнать правильные ответы.
20. пользователь 02.12.19 16:38
(19) да смысл полностью теряется. Возьмите мои деньги, только не просите ответов))))
G13ma; acanta; +2 Ответить
79. AnryMc 849 16.11.21 15:54 Сейчас в теме
(17) Кейнс перефразировал этот закон: «предложение порождает спрос» и перевернул закон Сэя с ног на голову, заявляя в 1930-х годах, что спрос рождает предложение.



Джон Мейнард Кейнс: Спрос рождает предложение
22. SantiouS 02.12.19 16:40 Сейчас в теме
Мои ответы (СПОЙЛЕР!)
25. SantiouS 02.12.19 17:22 Сейчас в теме
(22)
Продолжение (СПОЙЛЕР!)
maksa2005; +1 Ответить
34. пользователь 02.12.19 19:08
(25) Круто! По некоторым задачам дал комментарий.
А так все супер)


Небольшой комментарий
maksa2005; user883442; SantiouS; +3 Ответить
23. SantiouS 02.12.19 16:59 Сейчас в теме
Подскажите почему в 22 задаче ошибка:
"При выборе данных из объекта в запросе не могут присутствовать соединения и объединения".
Не могу осознать как это работает :)
27. vadim1011985 99 02.12.19 17:27 Сейчас в теме
(23) При выборе из внешних источников (из ТЗ например ) нельзя объединять или соединять запросы - только помещение во временную таблицу. В запросе же происходит скрытое объединение , так как данные тянутся из двух источников
SantiouS; +1 Ответить
30. пользователь 02.12.19 18:51
(27) все так.

Это можно объяснить техническими особенностями платформы.
Запрос к таблице значений - это такие действия платформы:
1. Создание временной таблицы
2. Загрузка данных в эту таблицу множеством запросов INSERT (в новых версиях платформы вроде бы поведение изменилось).
3. Пользуемся.

Но делать на этом этапе соединения с другими таблицами было бы неправильно или создало бы другие сложности.
Думаю, поэтому разработчики 1С и ввели эти ограничения.
24. Painted 49 02.12.19 17:19 Сейчас в теме
Первую задачу можно упростить до
Сообщить((Новый Структура) = (Новый Структура));
И вторую с третьей также.

Не?
26. SantiouS 02.12.19 17:24 Сейчас в теме
(24) Верно (на всякий случай даже в конфигураторе проверил).
Как я понимаю, то проверяются ссылки на структуру в памяти и они разные?
31. пользователь 02.12.19 18:53
(24) можно, но какой смысл?

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

Особого смысла в этом тут нет.
Риник; +1 Ответить
41. Painted 49 03.12.19 09:32 Сейчас в теме
(31)
можно, но какой смысл?
Код можно запустить в консоли кода. В вашем варианте придется городить целую обработку.
28. herfis 498 02.12.19 17:30 Сейчас в теме
Тю. Мне сначала показалось, что все задачи с подковыркой. Типа как puzzlers в других ЯП.
32. пользователь 02.12.19 18:54
(28) рад, что Вы со всеми задачами сразу справились без отладки.
29. RustIG 1351 02.12.19 18:37 Сейчас в теме
Возврат ((Новый Структура) = (Новый Структура));

Выскажу свое мнение по задаче №1.
НЕ проверял на платформе.

Только свое мнение. Обсуждение приветствуется.

Команда Новый Структура - по идее создает новый объект с типом "Структура", при этом в памяти резервируется ячейка памяти (адрес) под этот объект...
Поэтому в итоге мы сравниваем два объекта с разной адресацией в памяти. Значит на выходе сравнение должно дать или ошибку или Ложь - так как объекты разные. Ошибку может дать в связи с тем, что мы не знаем что заложено в платформу при сравнении подобных объектов.
Возможно при сравнении подобных объектов вызывается исключение, и в результате появляется ошибка.
YPermitin; +1 Ответить
33. пользователь 02.12.19 18:55
(29) да, все так.

Мы тут сравниваем абсолютно разные объекты и платформа нам говорит, что они не равны.

Чем-то похоже на сравнение объектов в каком-нибудь C#.
35. PLAstic 295 02.12.19 21:59 Сейчас в теме
36. пользователь 03.12.19 02:18
37. MikhailDr 03.12.19 08:02 Сейчас в теме
Не хватает комментариев к задачкам. По многим я так и не понял, почему платформа ведет себя именно так, а не иначе. Но в целом очень занимательно.
maksa2005; YPermitin; +2 Ответить
38. пользователь 03.12.19 08:45
(37) спасибо.

Можете написать вопросы здесь.
39. ids79 8291 03.12.19 08:54 Сейчас в теме
Большинство задач - ожидаемо. Но некоторые интересные, спасибо.
Задача 21 - забыл, что результат временной таблицы одну строку возвращает )).
Ну и задача 15 - классика!
YPermitin; +1 Ответить
40. Lenten 25 03.12.19 09:21 Сейчас в теме
а почему в 24 значение не поменялось
YPermitin; +1 Ответить
43. пользователь 03.12.19 10:29
(40) потому что в вызываемой функции присутствует Знач. То есть передача параметра осуществляется по значению, копированием в память на время вызова.
45. Rabot 90 03.12.19 11:10 Сейчас в теме
(40) "Задача24НаСервере(Знач ПереданноеЗначение)" - ключевое слово "Знач" перед параметром означает, что изменение его в процедуре/функции не влияет на переменную в источнике, получается такой параметр это не ссылка не переменную, а её копия.
Не знаю как это "по-научному" объяснить)
PLAstic; Lenten; +2 Ответить
42. akimych 227 03.12.19 10:20 Сейчас в теме
P.S. Лайк, репост, подписка!
Вот эта фраза к чему?
Инфостарт теперь в инстастарт превращается...
44. пользователь 03.12.19 10:30
(42) это называется - юмор.

Не создавать же публикации в книжном стиле.
46. ids79 8291 03.12.19 14:10 Сейчас в теме
В продолжении задачки 24 вариант с объектом.
Там не все так просто:

&НаКлиенте
Процедура ПередачаПоСсылкеКлиент(Параметр)
   Список= Новый СписокЗначений;
   Список.Добавить("привет");
   Список.Добавить("привет");
   Параметр = Список;
КонецПроцедуры

&НаКлиенте
Процедура ПередачаПоЗначениюКлиент1(Знач Параметр)
   Список= Новый СписокЗначений;
   Список.Добавить("привет");
   Список.Добавить("привет");
   Параметр = Список;
КонецПроцедуры

&НаКлиенте
Процедура ПередачаПоЗначениюКлиент2(Знач Параметр)
   Параметр.Добавить("привет");
КонецПроцедуры

&НаСервере
Процедура ПередачаПоСсылкеСервер(Параметр)
   Параметр.Добавить("привет");
КонецПроцедуры

&НаСервере
Процедура ПередачаПоЗначениюСервер(Знач Параметр)
   Параметр.Добавить("привет");
КонецПроцедуры

&НаКлиенте
Процедура ПередачаПараметровКлиентСервер()

    Список1= Новый СписокЗначений;
    Список1.Добавить("привет");
    Список2 = Список1.Скопировать();
    Список3 = Список1.Скопировать();    
    Список4 = Список1.Скопировать();    
    Список5 = Список1.Скопировать();    
	
    ПередачаПоСсылкеКлиент(Список1);
    ПередачаПоЗначениюКлиент1(Список2);
    ПередачаПоЗначениюКлиент2(Список3);
    ПередачаПоСсылкеСервер(Список4);
    ПередачаПоЗначениюСервер(Список5);
	
    Сообщить(Список1.Количество());
    Сообщить(Список2.Количество());
    Сообщить(Список3.Количество());
    Сообщить(Список4.Количество());
    Сообщить(Список5.Количество());
	
КонецПроцедуры
Показать


У кого какие варианты?
user695999_ivan.diak; YPermitin; +2 Ответить
49. пользователь 03.12.19 19:40
(46) я честно постарался в уме прокрутить, а потом проверил в отладчике.
Все таки промахнулся)))

Мой ответ



Ошибся в методе "ПередачаПоСсылкеСервер", почему-то решил что в итоге список не изменится :) Явная ошибка)))

Правильный ответ
50. dhurricane 03.12.19 19:50 Сейчас в теме
(46) Вроде так:
Список1 - 2 (инициализировали переданный в процедуру список новым с двумя значениями)
Список2 - 1 (инициализировали параметр, оригинал остался с одним значением)
Список3 - 2 (добавили в список элемент по переданной ссылке)
Список4 - 2 (список скопировался на сервер, там ему добавили элемент, затем список вернулся обратно)
Список5 - 1 (аналогично предыдущему пункту, только сам список не возвращается на клиент)

За ликбез по последнему пункту спасибо Андрею Овсянкину.
user695999_ivan.diak; ids79; YPermitin; +3 Ответить
51. пользователь 03.12.19 19:53
53. ids79 8291 04.12.19 08:36 Сейчас в теме
(50)Все верно. Да, спасибо Андрею.
Небольшое дополнение:
Список1 - передаем ссылку на объект. В процедуре присваиваем ссылке ссылку на новый объект. В точке вызова имеем новую ссылку и новый объект.
Список2 - передаем копию ссылки, объект остается один. Присваиваем копии ссылки ссылку на новый объект. Ссылка в точке вызова и изначальный объект остаются без изменения.
Список3 - передаем копию ссылки, объект остается один. Меняем по копии ссылки сам объект. В точке вызова ссылка та же, объект изменен.
47. Quantum81 6 03.12.19 19:13 Сейчас в теме
у меня 11 ошибок. Если можно 15ую за ошибку считать. С толку в таком контексте может здорово сбить.
В 12 попался, а не должен был! :)
Про потоки это вообще что было ... :))))
YPermitin; +1 Ответить
48. пользователь 03.12.19 19:36
(47) всего 11, это прям круче некуда)

Про потоки - изначально я хотел сделать другую задачу, но получилась эта :D
54. Quantum81 6 04.12.19 11:03 Сейчас в теме
Кстати, шутки шутками, а не давно едва не пришлось решать задачу с потоками.
Необходимо было передавать большие файлы(видео) с сервера на клиент. Когда одной командой получаешь из временного хранилища, то всё замирает и никак не реагирует. Уже собирался резать файл на кусочки двоичных данных с помощью потоков и раскладывать по временным хранилищам и на клиент отправлять массив адресов хранилищ.
Но обошлись предупреждающей табличкой :)
YPermitin; +1 Ответить
59. batsy66 61 04.12.19 16:34 Сейчас в теме
Закинул всё в обработку: infostart.ru/public/1163257/ Публикуется с разрешения автора
Hans; YPermitin; +2 Ответить
61. SlavaKron 04.12.19 22:58 Сейчас в теме
Как вам такое:
ТипЗнч(Метаданные.ПодпискиНаСобытия.ПодпискаНаСобытие1.Событие) = Тип("Строка")
Олсо, попробуйте такое на клиент передать. Фантомные боли 1С.
YPermitin; +1 Ответить
62. Hans 2 05.12.19 12:54 Сейчас в теме
16 правильных ответов.
YPermitin; +1 Ответить
63. bulpi 215 05.12.19 22:24 Сейчас в теме
В задаче 2 конструктор Новый Массив(0) у меня выдает ошибку. Релиз 8.3.13. Надо так : Новый Массив или Новый Массив(1)
64. bulpi 215 05.12.19 22:57 Сейчас в теме
Задача 11 :
ХранилищеОбщихНастроек.Сохранить("МоеЗначение", "МойКлюч", Неопределено);

Плохой пример. В результате получается Неопределено . И неясно, это мы достали Неопределено из хранилища, или там просто ничего нет. Хороший пример :
ХранилищеОбщихНастроек.Сохранить("МоеЗначение", "МойКлюч", 1);
65. bulpi 215 05.12.19 23:24 Сейчас в теме
Задача 17:
Похоже, в этой строке должно быть что-то более интересное :
Запись.ЗначениеПоиска = "ЗначениеR39;поиска";
Иначе все очевидно.
66. bulpi 215 05.12.19 23:47 Сейчас в теме
Задача 26 очевидно некорректна. Результат зависит от многих условий.
67. пользователь 06.12.19 06:16
(66) по задачам все так и было задумано.

Вы молодец!
68. CSiER 35 06.12.19 08:24 Сейчас в теме
К 24 можно добавить:
&НаКлиенте
Процедура Команда1(Команда)
	стр = "Завтрак";
	Задача31НаСервере(стр, стр, стр);
	Сообщить(стр);
КонецПроцедуры

&НаСервере
Процедура Задача31НаСервере(Парам1, Парам2, Парам3)	
	Парам1 = "Обед";
	Парам2 = "Ужин";	
КонецПроцедуры
Показать

Объяснение
el_nov; YPermitin; +2 Ответить
69. starik-2005 3033 07.12.19 10:45 Сейчас в теме
Блин, я думал тут задачи реальные типа найти циклические сцылки, а тут просто задачи на интерпретацию кода. Я только последнюю глянул - там ложь будет. Печаль...
YPermitin; +1 Ответить
70. пользователь 07.12.19 10:49
(69) ждем более качественный материал от Вас теперь)))
72. logarifm 1117 09.12.19 12:34 Сейчас в теме
Надо было выложить обработку с этими задачами, а то если честно проверять результат лень :) надо открывать конфигуратор пилить обработку.
YPermitin; +1 Ответить
73. пользователь 09.12.19 12:46
(72) для ленивых уже сделали отдельную публикацию))) Спасибо коллеге)

https://infostart.ru/public/1163257/
74. gelotus 30.11.20 12:20 Сейчас в теме
Вот интересный код. Как вы думаете что этот код выведет?


ТЗ  = Новый ТаблицаЗначений;
                ТЗ .Колонки.Добавить("Колонка1");
                
                Стр = ТЗ.Добавить();
                Стр.Колонка1 = "100";
                Стр = ТЗ.Добавить();
                Стр.Колонка1 = "200";
                
                Для каждого стр из ТЗ  Цикл
                               
                               Сообщить(Стр.Колонка1);
                               
                               ТЗ  = Новый ТаблицаЗначений;
                               ТЗ.Колонки.Добавить("Колонка2");
                               
                               Стр = ТЗ.Добавить();
                               Стр.Колонка2 = "ААА";
                               Стр = ТЗ.Добавить();
                               Стр.Колонка2 = "БББ";
                               
                               
                КонецЦикла;
Показать
Bukaska; TimkoNzt; user1464234; +3 Ответить
75. aleksey2 86 04.02.21 10:09 Сейчас в теме
(74)
ТЗ = Новый ТаблицаЗначений;
ТЗ .Колонки.Добавить("Колонка1");

100
200
76. PanKir 70 09.02.21 15:14 Сейчас в теме
(74)

100
Ошибка - в таблице нет колонки «Колнка1»
77. djvu 143 27.04.21 20:12 Сейчас в теме
(74)
Сначала, подумал:
"Ошибку, низзя строке присвоить значение: Стр = ТЗ.Добавить(); "

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

Какая область видимости "стр"?
Осуществляет ли "подъем" перменных компилятор/интерпретатор (или ХЕЗ, как его теперь называть)
и т.п. ...

Т.е. - проще, проверить "на практике", и это, кстати, не гарантирует, что от версии платформы к платформе поведение не будет меняться, такие ситуации проще исключать из практики
78. AnryMc 849 27.07.21 16:12 Сейчас в теме
А где список правильных ответов?

З.Ы. Не все ведь зубры... Стоит себя проверить...
З.Ы.Ы. (73) не считается - платный...
80. kuzyara 1900 01.12.23 15:17 Сейчас в теме
Кто автор публикации?
81. user2005458 14.03.24 07:56 Сейчас в теме
Нужны пояснения к ответам.
Оставьте свое сообщение