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

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

Цель статьи

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

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

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

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

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

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

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

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

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

Задачи

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

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

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

 

 Задачи с 1 по 10

 

 Задачи с 11 по 20

 

 Задачи с 21 по 30

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

Вам слово

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

 

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

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

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

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

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

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

71 Comments

  1. VmvLer

    если бы на инфостаре было «поле чудес», то тс стоял бы с микрофоном и принимал банки с огурцами.

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

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

    Просто так решать эти кроссворды имеет смысл на пенсии.

    Reply
  2. YPermitin

    (1) позитив детектед!

    Reply
  3. Hans

    сделай обработку в которой будет весь этот код. Либо под спойлером ответы с комментариями.

    Reply
  4. YPermitin

    (3) а зачем?

    Тогда весь смысл скатиться к «скачать и потыкать» кнопки.

    Reply
  5. Hans

    (4)весь смысл будет — сначала на бумажке ответить, а потом скачать и проверить. А по твоей схеме каждый на бумажке ответит, потом будет все это пилить в обработке, потом проверять.

    Reply
  6. YPermitin

    (5) лучше самому. Ответов смысла нет добавлять, там же все проще некуда.

    Reply
  7. DoctorRoza

    Автору спасибо! Порадовал!

    Reply
  8. dhurricane

    Не ожидал, конечно, подвоха в 15-ом задании. 🙂 Вы специально написали в словах букву «е» латиницей и кириллицей?

    Reply
  9. YPermitin

    (9) да. Вот только подсветка синтаксиса на ИС меня выдает :)))

    Reply
  10. dhurricane

    (10) Сколько не глядел, не увидел разницы. Только отладчик подсказал.

    Reply
  11. YPermitin

    (11) тогда я рад, что не сделал вашу жизнь проще :)))))

    Reply
  12. Quantum81

    Супер!

    Показывает как мы все любим отладчик. Такая инфа в голове вообще не держится 🙁

    Reply
  13. YPermitin

    (13) так оно 🙂

    Reply
  14. sergvagner2018

    (0) Как-то я приуныл после задач :))

    Reply
  15. herfis
    Думаю, нет смысла давать ответы на задачи, которые легко проверить в конфигураторе.

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

    Самому проверять лениво 🙂

    Reply
  16. YPermitin

    (16) возьмите себя в руки 🙂

    Да просто это будут нудные ответы. Такле за стартмани стыдно отдавать.

    Reply
  17. PLAstic

    (6) Да всем будет лень вбивать это всё в обработку. Я порешал 1-10, хотел глянуть ответы и плюнул, т.к. прочитал, что их не будет. Жаль потраченное время, хотя идея неплохая была.

    Reply
  18. PLAstic

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

    Reply
  19. YPermitin

    (19) да смысл полностью теряется. Возьмите мои деньги, только не просите ответов))))

    Reply
  20. YPermitin

    (18) ответил ниже)

    Reply
  21. SantiouS
    Мои ответы (СПОЙЛЕР!)
    Reply
  22. SantiouS

    Подскажите почему в 22 задаче ошибка:

    «При выборе данных из объекта в запросе не могут присутствовать соединения и объединения».

    Не могу осознать как это работает 🙂

    Reply
  23. Painted

    Первую задачу можно упростить до

    Сообщить((Новый Структура) = (Новый Структура));

    И вторую с третьей также.

    Не?

    Reply
  24. SantiouS

    (22)

    Продолжение (СПОЙЛЕР!)
    Reply
  25. SantiouS

    (24) Верно (на всякий случай даже в конфигураторе проверил).

    Как я понимаю, то проверяются ссылки на структуру в памяти и они разные?

    Reply
  26. vadim1011985

    (23) При выборе из внешних источников (из ТЗ например ) нельзя объединять или соединять запросы — только помещение во временную таблицу. В запросе же происходит скрытое объединение , так как данные тянутся из двух источников

    Reply
  27. herfis

    Тю. Мне сначала показалось, что все задачи с подковыркой. Типа как puzzlers в других ЯП.

    Reply
  28. Rustig
    Возврат ((Новый Структура) = (Новый Структура));

    Выскажу свое мнение по задаче №1.

    НЕ проверял на платформе.

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

    Команда Новый Структура — по идее создает новый объект с типом «Структура», при этом в памяти резервируется ячейка памяти (адрес) под этот объект…

    Поэтому в итоге мы сравниваем два объекта с разной адресацией в памяти. Значит на выходе сравнение должно дать или ошибку или Ложь — так как объекты разные. Ошибку может дать в связи с тем, что мы не знаем что заложено в платформу при сравнении подобных объектов.

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

    Reply
  29. YPermitin

    (27) все так.

    Это можно объяснить техническими особенностями платформы.

    Запрос к таблице значений — это такие действия платформы:

    1. Создание временной таблицы

    2. Загрузка данных в эту таблицу множеством запросов INSERT (в новых версиях платформы вроде бы поведение изменилось).

    3. Пользуемся.

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

    Думаю, поэтому разработчики 1С и ввели эти ограничения.

    Reply
  30. YPermitin

    (24) можно, но какой смысл?

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

    Особого смысла в этом тут нет.

    Reply
  31. YPermitin

    (28) рад, что Вы со всеми задачами сразу справились без отладки.

    Reply
  32. YPermitin

    (29) да, все так.

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

    Чем-то похоже на сравнение объектов в каком-нибудь C#.

    Reply
  33. YPermitin

    (25) Круто! По некоторым задачам дал комментарий.

    А так все супер)

    Небольшой комментарий
    Reply
  34. PLAstic

    (33) Наконец-то сдался! :))

    Reply
  35. YPermitin

    (35) :)))

    Reply
  36. MikhailDr

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

    Reply
  37. YPermitin

    (37) спасибо.

    Можете написать вопросы здесь.

    Reply
  38. ids79

    Большинство задач — ожидаемо. Но некоторые интересные, спасибо.

    Задача 21 — забыл, что результат временной таблицы одну строку возвращает )).

    Ну и задача 15 — классика!

    Reply
  39. Lenten

    а почему в 24 значение не поменялось

    Reply
  40. Painted

    (31)

    можно, но какой смысл?

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

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

    Вот эта фраза к чему?

    Инфостарт теперь в инстастарт превращается…

    Reply
  42. YPermitin

    (40) потому что в вызываемой функции присутствует Знач. То есть передача параметра осуществляется по значению, копированием в память на время вызова.

    Reply
  43. YPermitin

    (42) это называется — юмор.

    Не создавать же публикации в книжном стиле.

    Reply
  44. Rabot

    (40) «Задача24НаСервере(Знач ПереданноеЗначение)» — ключевое слово «Знач» перед параметром означает, что изменение его в процедуре/функции не влияет на переменную в источнике, получается такой параметр это не ссылка не переменную, а её копия.

    Не знаю как это «по-научному» объяснить)

    Reply
  45. ids79

    В продолжении задачки 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.Количество());

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

    У кого какие варианты?

    Reply
  46. Quantum81

    у меня 11 ошибок. Если можно 15ую за ошибку считать. С толку в таком контексте может здорово сбить.

    В 12 попался, а не должен был! 🙂

    Про потоки это вообще что было … :))))

    Reply
  47. YPermitin

    (47) всего 11, это прям круче некуда)

    Про потоки — изначально я хотел сделать другую задачу, но получилась эта 😀

    Reply
  48. YPermitin

    (46) я честно постарался в уме прокрутить, а потом проверил в отладчике.

    Все таки промахнулся)))

    Мой ответ

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

    Правильный ответ
    Reply
  49. dhurricane

    (46) Вроде так:

    Список1 — 2 (инициализировали переданный в процедуру список новым с двумя значениями)

    Список2 — 1 (инициализировали параметр, оригинал остался с одним значением)

    Список3 — 2 (добавили в список элемент по переданной ссылке)

    Список4 — 2 (список скопировался на сервер, там ему добавили элемент, затем список вернулся обратно)

    Список5 — 1 (аналогично предыдущему пункту, только сам список не возвращается на клиент)

    За ликбез по последнему пункту спасибо Андрею Овсянкину.

    Reply
  50. YPermitin

    (50) идеально!

    Reply
  51. ids79

    (50)Все верно. Да, спасибо Андрею.

    Небольшое дополнение:

    Список1 — передаем ссылку на объект. В процедуре присваиваем ссылке ссылку на новый объект. В точке вызова имеем новую ссылку и новый объект.

    Список2 — передаем копию ссылки, объект остается один. Присваиваем копии ссылки ссылку на новый объект. Ссылка в точке вызова и изначальный объект остаются без изменения.

    Список3 — передаем копию ссылки, объект остается один. Меняем по копии ссылки сам объект. В точке вызова ссылка та же, объект изменен.

    Reply
  52. Quantum81

    Кстати, шутки шутками, а не давно едва не пришлось решать задачу с потоками.

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

    Но обошлись предупреждающей табличкой 🙂

    Reply
  53. GreenDragon

    (2) детектив позитивед.

    Юрий, мне показалось, что в заголовке отсылка к Елене Рассохиной?

    Reply
  54. YPermitin

    (55) ммм, а кто это?

    Reply
  55. GreenDragon

    (56) значит показалось. g «Неновости». В самом начале каждого выпуска фраза про «странные и не очень».

    Reply
  56. YPermitin

    (57) что-то знакомое, но не могу вспомнить. Вечером гляну)

    Плагиат сделал случайно)))

    Reply
  57. batsy66

    Закинул всё в обработку: infostart.ru/public/1163257/ Публикуется с разрешения автора

    Reply
  58. YPermitin

    (57) посмотрел.

    — Совпадение?

    — Не думаю 🙂

    Видимо где-то услышал и «под корку» записалось.

    Reply
  59. SlavaKron

    Как вам такое:

    ТипЗнч(Метаданные.ПодпискиНаСобытия.ПодпискаНаСобытие1.Событие) = Тип(«Строка»)

    Олсо, попробуйте такое на клиент передать. Фантомные боли 1С.

    Reply
  60. Hans

    16 правильных ответов.

    Reply
  61. bulpi

    В задаче 2 конструктор Новый Массив(0) у меня выдает ошибку. Релиз 8.3.13. Надо так : Новый Массив или Новый Массив(1)

    Reply
  62. bulpi

    Задача 11 :

    ХранилищеОбщихНастроек.Сохранить(«МоеЗначение», «МойКлюч», Неопределено);

    Плохой пример. В результате получается Неопределено . И неясно, это мы достали Неопределено из хранилища, или там просто ничего нет. Хороший пример :

    ХранилищеОбщихНастроек.Сохранить(«МоеЗначение», «МойКлюч», 1);

    Reply
  63. bulpi

    Задача 17:

    Похоже, в этой строке должно быть что-то более интересное :

    Запись.ЗначениеПоиска = «ЗначениеR39;поиска»;

    Иначе все очевидно.

    Reply
  64. bulpi

    Задача 26 очевидно некорректна. Результат зависит от многих условий.

    Reply
  65. YPermitin

    (66) по задачам все так и было задумано.

    Вы молодец!

    Reply
  66. CSiER

    К 24 можно добавить:

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

    Показать

    Объяснение

    Reply
  67. starik-2005

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

    Reply
  68. YPermitin

    (69) ждем более качественный материал от Вас теперь)))

    Reply
  69. wolfsoft

    Женский вариант: «Корову бы ей, а лучше две» (с)

    Мужской вариант: «Когда коту нечего делать, он …» (с)

    Reply
  70. logarifm

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

    Reply
  71. YPermitin

    (72) для ленивых уже сделали отдельную публикацию))) Спасибо коллеге)

    https://infostart.ru/public/1163257/

    Reply

Leave a Comment

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