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 не будет опубликован. Обязательные поля помечены *