Цель статьи
Вы когда-нибудь проходили собеседование, на котором дают разного рода задачи с проверкой результата? Простой код, результат которого нужно объяснить. Мое мнение таково, что подобные задачи вряд ли могут дать полную картину о компетенциях разработчика, поэтому собеседование лучше проводить другими путями.
Но, подобные задачки могут быть интересными головоломками и в какой-то мере показать ту боль, что прошел разработчик за годы работы с платформой. А там, где может быть что-то интересное, почему бы не поразбираться.
В одной из предыдущих статей "Баг или фича? Неожиданное поведение платформы" мы коснулись нескольких особенностей в поведении платформы 1С. Баги это или фичи, трудно сказать. Решать это Вам. Сегодня мы рассмотрим 30 простых фрагментов кода, а Вам нужно будет сказать какой результат выполнения будет для каждой из них.
Нет, это не проверка Ваших знаний, компетенций, навыков и целеустремленности. Цель публикации — сбор интересных и не очень задач, над которыми было бы интересно посидеть, проверить на сколько предсказуемо работает платформа 1С с Вашей точки зрения. Можно, конечно, эти задачи показывать и на собеседовании, но лучше обсудите с кандидатом предыдущий опыт работы. Так будет намного содержательней.
А все что ниже — это больше для веселья!
Среда выполнения
Весь продемонстрированный далее код выполнялся на платформе 1С версии 8.3.13.1690 в клиент-серверном варианте работы, управляемые формы. Никаких особых настроек не выполнялось. Обычно код задачи делится на клиентский и серверный. Можете вставить фрагмент в управляемую форму и разбить процедуры и функции по контексту выполнения с помощью директив "&НаКлиенте" и "&НаСервере".
Думаю, что поведение кода в задачах будет одинаковым как для файловой, так и для клиент-серверной базы, поэтому если сервера у Вас под рукой нет, то это не повод не попробовать эти задачи решить. Плюс ко всему, сама версия платформы не должна стать причиной разного поведения, даже если у Вас старая добрая версия 8.3.5! В последнем случае только некоторые из задач не могут быть решены (там где работа с потоками, например).
В общем, ничего особенного. Просто берете и делаете 🙂
Задачи
Хватит болтать, пора действовать!
Сложность задач не зависит от раздела и номера, все перемешано. Сделано это специально, чтобы у Вас не было ожиданий сложности. Так ведь интересней!
Рекомендую сначала прорешать задачу без конфигуратора с кратким объяснением своему решению, а после уже проверить себя, отдав код на выполнение платформе 1С. Выкладывать результаты для всех или нет — дело только Ваше. Но, думаю, что было бы интересно поднять обсуждение.
Первая порция задач.
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача1(Команда)
РезультатАлгоритма = Задача1НаСервере();
Сообщить(РезультатАлгоритма);
КонецПроцедуры
&НаСервере
Функция Задача1НаСервере()
Возврат ((Новый Структура) = (Новый Структура));
КонецФункции
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача2(Команда)
РезультатАлгоритма = Задача2НаСервере();
Сообщить(РезультатАлгоритма);
КонецПроцедуры
&НаСервере
Функция Задача2НаСервере()
Возврат ((Новый Массив(0)) = (Новый Массив(0)));
КонецФункции
№3: Сравнение незаполненных значений
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача3(Команда)
РезультатАлгоритма = Задача3НаСервере();
Сообщить(РезультатАлгоритма);
КонецПроцедуры
&НаСервере
Функция Задача3НаСервере()
Возврат (Null = Неопределено);
КонецФункции
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача4(Команда)
Задача4НаСервере();
КонецПроцедуры
&НаСервере
Функция Задача4НаСервере()
Возврат Сравнение1()
ИЛИ Сравнение2()
ИЛИ Сравнение3()
ИЛИ Сравнение4()
ИЛИ Сравнение5();
КонецФункции
Функция Сравнение1()
Сообщить("Сравнение 1");
Возврат Ложь;
КонецФункции
Функция Сравнение2()
Сообщить("Сравнение 2");
Возврат Ложь;
КонецФункции
Функция Сравнение3()
Сообщить("Сравнение 3");
Возврат Истина;
КонецФункции
Функция Сравнение4()
Сообщить("Сравнение 4");
Возврат Ложь;
КонецФункции
Функция Сравнение5()
Сообщить("Сравнение 5");
Возврат Истина;
КонецФункции
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача5(Команда)
Задача5НаСервере();
КонецПроцедуры
&НаСервере
Функция Задача5НаСервере()
Возврат Сравнение1()
И Сравнение2()
И Сравнение3()
И Сравнение4()
И Сравнение5();
КонецФункции
Функция Сравнение1()
Сообщить("Сравнение 1");
Возврат Ложь;
КонецФункции
Функция Сравнение2()
Сообщить("Сравнение 2");
Возврат Ложь;
КонецФункции
Функция Сравнение3()
Сообщить("Сравнение 3");
Возврат Истина;
КонецФункции
Функция Сравнение4()
Сообщить("Сравнение 4");
Возврат Ложь;
КонецФункции
Функция Сравнение5()
Сообщить("Сравнение 5");
Возврат Истина;
КонецФункции
№6: Обычная передача структуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача6(Команда)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 1);
Задача6НаСервере(СтруктураДанных);
Сообщить(СтруктураДанных.Значение);
КонецПроцедуры
&НаСервере
Процедура Задача6НаСервере(СтруктураДанных)
СтруктураДанных.Значение = 100;
КонецПроцедуры
№7: Передача значения фиксированной структуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача7(Команда)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 1);
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
Задача7НаСервере(ФиксированнаяСтруктураДанных.Значение);
Сообщить(СтруктураДанных.Значение);
КонецПроцедуры
&НаСервере
Процедура Задача7НаСервере(ПереданноеЗначение)
ПереданноеЗначение = 123456;
КонецПроцедуры
№8: Передача фиксированной структуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача8(Команда)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 1);
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
Задача8НаСервере(ФиксированнаяСтруктураДанных);
Сообщить(ФиксированнаяСтруктураДанных.Значение);
КонецПроцедуры
&НаСервере
Процедура Задача8НаСервере(ФиксированнаяСтруктураДанных)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 123);
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача9(Команда)
Задача9НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача9НаСервере()
ТекущаяДатаНаСервере = ТекущаяДатаСеанса();
ИзмененнаяДатаНаСервере = ТекущаяДатаНаСервере + 0.001;
ДатыРавны = (ТекущаяДатаНаСервере = ИзмененнаяДатаНаСервере);
Сообщить(ДатыРавны);
КонецПроцедуры
№10: Еще одно сравнение дат
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача10(Команда)
Задача10НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача10НаСервере()
ТекущаяДатаНаСервере = ТекущаяДатаСеанса();
ИзмененнаяДатаНаСервере = ТекущаяДатаНаСервере + 0.001;
ДатыРавны = (Строка(ТекущаяДатаНаСервере) = Строка(ИзмененнаяДатаНаСервере));
Сообщить(ДатыРавны);
КонецПроцедуры
На этом первая порция задач закончена. Выпейте крепкого чая и продолжим.
Вторая порция задач.
№11: Попытка в транзакции
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача11(Команда)
Задача11НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача11НаСервере()
НачатьТранзакцию();
Попытка
ХранилищеОбщихНастроек.Сохранить("МоеЗначение", "МойКлюч", Неопределено);
ВызватьИсключение "Ты не пройдешь!";
ЗафиксироватьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПопытки;
ЗначениеИзХранилища = ХранилищеОбщихНастроек.Загрузить("МоеЗначение", "МойКлюч");
Сообщить(ЗначениеИзХранилища);
КонецПроцедуры
№12: Запутанная попытка в транзакции
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача12(Команда)
Задача12НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача12НаСервере()
ПроверочноеЗначение = Неопределено;
НачатьТранзакцию();
Попытка
ХранилищеОбщихНастроек.Сохранить("МоеЗначение", "МойКлюч", Неопределено);
ВызватьИсключение "Ты не пройдешь!";
ЗафиксироватьТранзакцию();
Исключение
ХранилищеОбщихНастроек.Сохранить("МоеЗначениеПроверочное", "МойКлючПроверочное", 110011);
ПроверочноеЗначение = ХранилищеОбщихНастроек.Загрузить("МоеЗначениеПроверочное", "МойКлючПроверочное");
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПопытки;
ЗначениеИзХранилища = ХранилищеОбщихНастроек.Загрузить("МоеЗначение", "МойКлюч");
Сообщить(ПроверочноеЗначение);
КонецПроцедуры
№13: Небольшое сравнение чисел
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача13(Команда)
Задача13НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача13НаСервере()
ЧислоПроверка = 0.000102410434234235348573456378465353465;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| &ЧислоПроверка КАК ЧислоПроверка
|ПОМЕСТИТЬ ВТ
|;
|
|ВЫБРАТЬ
| ВТ.ЧислоПроверка КАК ЧислоПроверка
|ИЗ
| ВТ КАК ВТ";
Запрос.УстановитьПараметр("ЧислоПроверка", ЧислоПроверка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЧислаРавны = Выборка.ЧислоПроверка = ЧислоПроверка;
Сообщить("ЧислаРавны: " + ЧислаРавны);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача14(Команда)
Задача14НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача14НаСервере()
СтрокиРавны = ("Привет" = "ПРИВЕТ");
Сообщить(СтрокиРавны);
КонецПроцедуры
№15: Еще одно сравнение строк
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача15(Команда)
Задача15НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача15НаСервере()
СтрокиРавны = ("Привeт" = "Привет");
Сообщить(СтрокиРавны);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача16(Команда)
Задача16НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача16НаСервере(НомерВызова = 0)
НомерВызова = НомерВызова + 1;
Сообщить(НомерВызова);
Задача16НаСервере(НомерВызова)
КонецПроцедуры
№17: Поиск в таблице значений
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача17(Команда)
Задача17НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача17НаСервере()
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("ЗначениеПоиска");
ТаблицаДанных.Колонки.Добавить("Значение");
Запись = ТаблицаДанных.Добавить();
Запись.ЗначениеПоиска = "ЗначениеR39;поиска";
Запись.Значение = 100;
НайденноеЗначение = 0;
ПоискЗаписи = ТаблицаДанных.НайтиСтроки(Новый Структура("ЗначениеПоиска", "Значение поиска"));
Если ПоискЗаписи.Количество() > 0 Тогда
НайденноеЗначение = ПоискЗаписи.Получить(0).Значение;
Иначе
НайденноеЗначение = 0;
КонецЕсли;
Сообщить(НайденноеЗначение);
КонецПроцедуры
№18: Работа с потоками (на самом деле нет)
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача18(Команда)
Задача18НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача18НаСервере()
МассивЗначений = Новый Массив;
МассивЗначений.Добавить(0);
МассивЗначений.Добавить(1);
МассивЗначений.Добавить(2);
МассивЗначений.Добавить(3);
МассивЗначений.Добавить(4);
МассивЗначений.Добавить(5);
ПотокВПамяти = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);
Для Каждого ЭлементМассива Из МассивЗначений Цикл
ЗаписьДанных.ЗаписатьЦелое64(ЭлементМассива);
КонецЦикла;
ЗаписьДанных.Закрыть();
МассивКакДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
ВременныйФайл = ПолучитьИмяВременногоФайла("tmp");
МассивКакДвоичныеДанные.Записать(ВременныйФайл);
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ВременныйФайл);
ВесьТекст = ТекстовыйДокумент.ПолучитьТекст();
Сообщить(ВесьТекст);
КонецПроцедуры
Что выведет этот код? И выполнится ли? (Только по Windows)
&НаКлиенте
Процедура Задача19(Команда)
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run("notepad");
Задача19НаСервере(WshShell);
Сообщить("Ура, заработало!");
КонецПроцедуры
&НаСервере
Процедура Задача19НаСервере(WshShell)
WshShell.Run("notepad");
Сообщить("Привет с сервера!");
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача20(Команда)
Задача20НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача20НаСервере()
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run("notepad");
АдресВХранилище = ПоместитьВоВременноеХранилище(WshShell, УникальныйИдентификатор);
ОбъектИзХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);
ТипОбъектаИзХранилища = ТипЗнч(ОбъектИзХранилища);
Сообщить(ТипОбъектаИзХранилища);
КонецПроцедуры
Вторая порция задач закончена. Можете передохнуть и потратить новый рабочий день на решение третьей порции задач! 🙂
Последняя порция задач.
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача21(Команда)
Задача21НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача21НаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| 1 КАК ЧислоЗначение
|ПОМЕСТИТЬ ВТ_Значения
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 2
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 3
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Значения_1.ЧислоЗначение КАК ЧислоЗначение_1,
| ВТ_Значения_2.ЧислоЗначение КАК ЧислоЗначение_2,
| ВТ_Значения_3.ЧислоЗначение КАК ЧислоЗначение_3
|ИЗ
| ВТ_Значения КАК ВТ_Значения_1,
| ВТ_Значения КАК ВТ_Значения_2,
| ВТ_Значения КАК ВТ_Значения_3";
РезультатыЗапроса = Запрос.ВыполнитьПакет();
Выборка1 = РезультатыЗапроса[0].Выбрать();
Выборка2 = РезультатыЗапроса[1].Выбрать();
ОбщееКоличествоЗаписей = Выборка1.Количество() + Выборка2.Количество();
Сообщить(ОбщееКоличествоЗаписей);
КонецПроцедуры
№22: Таблицы значений в запросе
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача22(Команда)
Задача22НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача22НаСервере()
ТаблицаДляЗапроса = Новый ТаблицаЗначений;
ТаблицаДляЗапроса.Колонки.Добавить("ЗначениеСтрока", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(150)));
ТаблицаДляЗапроса.Колонки.Добавить("ЗначениеЧисло", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2)));
Запись = ТаблицаДляЗапроса.Добавить();
Запись.ЗначениеСтрока = "Один";
Запись.ЗначениеЧисло = 1;
Запись = ТаблицаДляЗапроса.Добавить();
Запись.ЗначениеСтрока = "Два";
Запись.ЗначениеЧисло = 2;
Запись = ТаблицаДляЗапроса.Добавить();
Запись.ЗначениеСтрока = "Три";
Запись.ЗначениеЧисло = 3;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т1.ЗначениеСтрока КАК ЗначениеСтрока1,
| Т1.ЗначениеЧисло КАК ЗначениеЧисло1,
| Т2.ЗначениеСтрока КАК ЗначениеСтрока2,
| Т2.ЗначениеЧисло КАК ЗначениеЧисло2
|ПОМЕСТИТЬ ВТ_ДанныеТаблицыЗначений
|ИЗ
| &ТаблицаДляЗапроса КАК Т1,
| &ТаблицаДляЗапроса КАК Т2
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ДанныеТаблицыЗначений.ЗначениеСтрока1 КАК ЗначениеСтрока1,
| ВТ_ДанныеТаблицыЗначений.ЗначениеЧисло1 КАК ЗначениеЧисло1,
| ВТ_ДанныеТаблицыЗначений.ЗначениеСтрока1 КАК ЗначениеСтрока2,
| ВТ_ДанныеТаблицыЗначений.ЗначениеЧисло1 КАК ЗначениеЧисло2
|ИЗ
| ВТ_ДанныеТаблицыЗначений КАК ВТ_ДанныеТаблицыЗначений";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
КоличествоЗаписей = Выборка.Количество();
Сообщить(КоличествоЗаписей);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача23(Команда)
Задача23НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача23НаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 0
| Т.Значение КАК Значение
|ИЗ
| (ВЫБРАТЬ
| 1 КАК Значение
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| 2) КАК Т";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
КоличествоЗаписей = ВыборкаДетальныеЗаписи.Количество();
Сообщить(КоличествоЗаписей);
КонецПроцедуры
№24: Еще одна передача значений фиксированной структуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача24(Команда)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 1);
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
Задача24НаСервере(ФиксированнаяСтруктураДанных.Значение);
Сообщить(СтруктураДанных.Значение);
КонецПроцедуры
&НаСервере
Процедура Задача24НаСервере(Знач ПереданноеЗначение)
ПереданноеЗначение = 123456;
КонецПроцедуры
№25: Особые операции с массивом
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача25(Команда)
МассивЗначений = Новый Массив;
МассивЗначений.Добавить(1000);
МассивЗначений.Добавить(Новый Структура("Значение", 2000));
МассивЗначений.Добавить(Дата(2024, 11, 11));
Задача25НаСервере(МассивЗначений, МассивЗначений);
РезультатВычислений = МассивЗначений.Получить(0)
+ МассивЗначений.Получить(1).Значение
+ Год(МассивЗначений.Получить(2));
Сообщить(РезультатВычислений);
КонецПроцедуры
&НаСервере
Процедура Задача25НаСервере(Знач МассивЗначений1, МассивЗначений2)
МассивЗначений1.Установить(0, 10000);
МассивЗначений1.Получить(1).Значение = 20000;
МассивЗначений1.Установить(2, Дата(2024,11,11));
МассивЗначений2.Установить(0, 10000);
МассивЗначений2.Получить(1).Значение = 20000;
МассивЗначений2.Установить(2, Дата(2024,11,11));
КонецПроцедуры
№26: Сравнение дат еще раз
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача26(Команда)
Задача26НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача26НаСервере()
ДатыРавны = (ТекущаяДата() = ТекущаяДатаСеанса());
Сообщить(ДатыРавны);
КонецПроцедуры
№27: Немного цикла и вычислений
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача27(Команда)
Задача27НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача27НаСервере()
РезультатВычислений = 0;
Для Сч = 1 По 10 Цикл
Остаток = Сч % 2;
Если Остаток > 0 Тогда
РезультатВычислений = РезультатВычислений + Сч;
КонецЕсли;
КонецЦикла;
Сообщить(РезультатВычислений);
КонецПроцедуры
№28: Проверка на заполненность
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача28(Команда)
Задача28НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача28НаСервере()
ПустойGUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
GUIDЗаполнен = ЗначениеЗаполнено(ПустойGUID);
Сообщить(GUIDЗаполнен);
КонецПроцедуры
№29: Математика наше все!
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача29(Команда)
Задача29НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача29НаСервере()
РезультатВычислений = Pow((5 * 1) / (7 % 2) * Sqrt(9), 2);
Сообщить(РезультатВычислений);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача30(Команда)
Задача30НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача30НаСервере()
ИсходноеЗначение = 1.5;
НовоеЗначение1 = Окр(ИсходноеЗначение, 2, РежимОкругления.Окр15как20);
НовоеЗначение2 = Окр(ИсходноеЗначение, 2, РежимОкругления.Окр15как10);
ЗначенияРавны = (НовоеЗначение1 = НовоеЗначение2);
Сообщить(ЗначенияРавны);
КонецПроцедуры
Теперь откиньтесь на спинку компьютерного кресла и проверьте результаты на практике.
Так много кода! Так много задач! И так мало ответов!
Вам слово
Прошли весь путь и не нашли ответов? Все так. Думаю, нет смысла давать ответы на задачи, которые легко проверить в конфигураторе. Надеюсь, я смог хоть немного Вас запутать и улыбнуться.
Небольшой комментарий от автора
Это небольшая часть моей коллекции задач, которая скопилась у меня за многие годы. И, кстати, некоторые из них, не смотря на то, что сталкивался с ними ранее, я не смог решить сходу правильно.
Если в Ваших "чертогах разума" также есть интересные задачки или комментарии по задачам из статьи, то добро пожаловать в комментарии!
P.S. Лайк, репост, подписка!
Другие ссылки
Похожих тем не нашел, но если подскажите, то добавлю сюда.
Авторские разработки
если бы на инфостаре было «поле чудес», то тс стоял бы с микрофоном и принимал банки с огурцами.
чес-слово, представленные задачи что-то а ля кроссворда для пенсионера 1С-ка, которому не хрен заняться и он
сушит себеразвивает себе мозг.Как правило, в реальной задаче, отладчик покажет где косяк если лень было включать мозг при написании кода.
Просто так решать эти кроссворды имеет смысл на пенсии.
(1) позитив детектед!
сделай обработку в которой будет весь этот код. Либо под спойлером ответы с комментариями.
(3) а зачем?
Тогда весь смысл скатиться к «скачать и потыкать» кнопки.
(4)весь смысл будет — сначала на бумажке ответить, а потом скачать и проверить. А по твоей схеме каждый на бумажке ответит, потом будет все это пилить в обработке, потом проверять.
(5) лучше самому. Ответов смысла нет добавлять, там же все проще некуда.
Автору спасибо! Порадовал!
Не ожидал, конечно, подвоха в 15-ом задании. 🙂 Вы специально написали в словах букву «е» латиницей и кириллицей?
(9) да. Вот только подсветка синтаксиса на ИС меня выдает :)))
(10) Сколько не глядел, не увидел разницы. Только отладчик подсказал.
(11) тогда я рад, что не сделал вашу жизнь проще :)))))
Супер!
Показывает как мы все любим отладчик. Такая инфа в голове вообще не держится 🙁
(13) так оно 🙂
(0) Как-то я приуныл после задач :))
Как это нету? Я готов заплатить старманю, просто чтобы не тратить время на проверку своих ожиданий.
Самому проверять лениво 🙂
(16) возьмите себя в руки 🙂
Да просто это будут нудные ответы. Такле за стартмани стыдно отдавать.
(6) Да всем будет лень вбивать это всё в обработку. Я порешал 1-10, хотел глянуть ответы и плюнул, т.к. прочитал, что их не будет. Жаль потраченное время, хотя идея неплохая была.
(17) Вот-вот, уже прямым текстом говорят, что чтобы оставить позитивное впечатление, даже за баксы готовы узнать правильные ответы.
(19) да смысл полностью теряется. Возьмите мои деньги, только не просите ответов))))
(18) ответил ниже)
Первая порция задач:
1. Ложь
2. Не выполнится
3. Ложь
4. Истина
5. Ложь
6. 100
7. Не выполнится
8. 123
9. Ложь
10. Истина
Вторая порция задач:
11. Неопределено
12. 110011 (но, как я понял, в самом «ХранилищеОбщихНастроек» ничего не сохранилось)
13. Ложь (Выборка.ЧислоПроверка=0,0001024104342342353485734563784653534)
14. Ложь
15. Ложь
16. Бесконечная рекурсия
17. 0
18. Будет ошибка, но не совсем ясно что вообще хотели вывести
19. Ошибка. Нельзя передавать COM объект на сервер.
20. Ошибка. Нельзя поместить COM объект во временное хранилище.
Третья порция задач:
21. 28
22. Ошибка.
23. 0.
24. 1.
Подскажите почему в 22 задаче ошибка:
«При выборе данных из объекта в запросе не могут присутствовать соединения и объединения».
Не могу осознать как это работает 🙂
Первую задачу можно упростить до
И вторую с третьей также.
Не?
(22)
26. Истина.
27. 25.
28. Ложь
29. 225.
30. Истина
(24) Верно (на всякий случай даже в конфигураторе проверил).
Как я понимаю, то проверяются ссылки на структуру в памяти и они разные?
(23) При выборе из внешних источников (из ТЗ например ) нельзя объединять или соединять запросы — только помещение во временную таблицу. В запросе же происходит скрытое объединение , так как данные тянутся из двух источников
Тю. Мне сначала показалось, что все задачи с подковыркой. Типа как puzzlers в других ЯП.
Выскажу свое мнение по задаче №1.
НЕ проверял на платформе.
Только свое мнение. Обсуждение приветствуется.
Команда Новый Структура — по идее создает новый объект с типом «Структура», при этом в памяти резервируется ячейка памяти (адрес) под этот объект…
Поэтому в итоге мы сравниваем два объекта с разной адресацией в памяти. Значит на выходе сравнение должно дать или ошибку или Ложь — так как объекты разные. Ошибку может дать в связи с тем, что мы не знаем что заложено в платформу при сравнении подобных объектов.
Возможно при сравнении подобных объектов вызывается исключение, и в результате появляется ошибка.
(27) все так.
Это можно объяснить техническими особенностями платформы.
Запрос к таблице значений — это такие действия платформы:
1. Создание временной таблицы
2. Загрузка данных в эту таблицу множеством запросов INSERT (в новых версиях платформы вроде бы поведение изменилось).
3. Пользуемся.
Но делать на этом этапе соединения с другими таблицами было бы неправильно или создало бы другие сложности.
Думаю, поэтому разработчики 1С и ввели эти ограничения.
(24) можно, но какой смысл?
В том плане что запись кода в одну строку смысла не меняет, а иногда может и усложнить его чтение.
Особого смысла в этом тут нет.
(28) рад, что Вы со всеми задачами сразу справились без отладки.
(29) да, все так.
Мы тут сравниваем абсолютно разные объекты и платформа нам говорит, что они не равны.
Чем-то похоже на сравнение объектов в каком-нибудь C#.
(25) Круто! По некоторым задачам дал комментарий.
А так все супер)
5. Все так. Ну а выведется «Сравнение 1» и все.
16. Верно. Будет ошибка переполнения стэка, при этом платформа выведет множество сообщений, сколько успеет.
18. Тут ошибка неявная при передаче странных символов с клиента на сервер в сообщении.
(33) Наконец-то сдался! :))
(35) :)))
Не хватает комментариев к задачкам. По многим я так и не понял, почему платформа ведет себя именно так, а не иначе. Но в целом очень занимательно.
(37) спасибо.
Можете написать вопросы здесь.
Большинство задач — ожидаемо. Но некоторые интересные, спасибо.
Задача 21 — забыл, что результат временной таблицы одну строку возвращает )).
Ну и задача 15 — классика!
а почему в 24 значение не поменялось
(31)
Код можно запустить в консоли кода. В вашем варианте придется городить целую обработку.
Вот эта фраза к чему?
Инфостарт теперь в инстастарт превращается…
(40) потому что в вызываемой функции присутствует Знач. То есть передача параметра осуществляется по значению, копированием в память на время вызова.
(42) это называется — юмор.
Не создавать же публикации в книжном стиле.
(40) «Задача24НаСервере(Знач ПереданноеЗначение)» — ключевое слово «Знач» перед параметром означает, что изменение его в процедуре/функции не влияет на переменную в источнике, получается такой параметр это не ссылка не переменную, а её копия.
Не знаю как это «по-научному» объяснить)
В продолжении задачки 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.Количество());
КонецПроцедуры
У кого какие варианты?
у меня 11 ошибок. Если можно 15ую за ошибку считать. С толку в таком контексте может здорово сбить.
В 12 попался, а не должен был! 🙂
Про потоки это вообще что было … :))))
(47) всего 11, это прям круче некуда)
Про потоки — изначально я хотел сделать другую задачу, но получилась эта 😀
(46) я честно постарался в уме прокрутить, а потом проверил в отладчике.
Все таки промахнулся)))
2, 1, 2, 1, 1
Ошибся в методе «ПередачаПоСсылкеСервер», почему-то решил что в итоге список не изменится 🙂 Явная ошибка)))
(46) Вроде так:
Список1 — 2 (инициализировали переданный в процедуру список новым с двумя значениями)
Список2 — 1 (инициализировали параметр, оригинал остался с одним значением)
Список3 — 2 (добавили в список элемент по переданной ссылке)
Список4 — 2 (список скопировался на сервер, там ему добавили элемент, затем список вернулся обратно)
Список5 — 1 (аналогично предыдущему пункту, только сам список не возвращается на клиент)
Заликбез по последнему пункту спасибо Андрею Овсянкину.
(50) идеально!
(50)Все верно. Да, спасибо Андрею.
Небольшое дополнение:
Список1 — передаем ссылку на объект. В процедуре присваиваем ссылке ссылку на новый объект. В точке вызова имеем новую ссылку и новый объект.
Список2 — передаем копию ссылки, объект остается один. Присваиваем копии ссылки ссылку на новый объект. Ссылка в точке вызова и изначальный объект остаются без изменения.
Список3 — передаем копию ссылки, объект остается один. Меняем по копии ссылки сам объект. В точке вызова ссылка та же, объект изменен.
Кстати, шутки шутками, а не давно едва не пришлось решать задачу с потоками.
Необходимо было передавать большие файлы(видео) с сервера на клиент. Когда одной командой получаешь из временного хранилища, то всё замирает и никак не реагирует. Уже собирался резать файл на кусочки двоичных данных с помощью потоков и раскладывать по временным хранилищам и на клиент отправлять массив адресов хранилищ.
Но обошлись предупреждающей табличкой 🙂
(2) детектив позитивед.
Юрий, мне показалось, что в заголовке отсылка к Елене Рассохиной?
(55) ммм, а кто это?
(56) значит показалось. g «Неновости». В самом начале каждого выпуска фраза про «странные и не очень».
(57) что-то знакомое, но не могу вспомнить. Вечером гляну)
Плагиат сделал случайно)))
Закинул всё в обработку:infostart.ru/public/1163257/ Публикуется с разрешения автора
(57) посмотрел.
— Совпадение?
— Не думаю 🙂
Видимо где-то услышал и «под корку» записалось.
Как вам такое:
Олсо, попробуйте такое на клиент передать. Фантомные боли 1С.
16 правильных ответов.
В задаче 2 конструктор Новый Массив(0) у меня выдает ошибку. Релиз 8.3.13. Надо так : Новый Массив или Новый Массив(1)
Задача 11 :
ХранилищеОбщихНастроек.Сохранить(«МоеЗначение», «МойКлюч», Неопределено);
Плохой пример. В результате получается Неопределено . И неясно, это мы достали Неопределено из хранилища, или там просто ничего нет. Хороший пример :
ХранилищеОбщихНастроек.Сохранить(«МоеЗначение», «МойКлюч», 1);
Задача 17:
Похоже, в этой строке должно быть что-то более интересное :
Запись.ЗначениеПоиска = «ЗначениеR39;поиска»;
Иначе все очевидно.
Задача 26 очевидно некорректна. Результат зависит от многих условий.
(66) по задачам все так и было задумано.
Вы молодец!
К 24 можно добавить:
Показать
Блин, я думал тут задачи реальные типа найти циклические сцылки, а тут просто задачи на интерпретацию кода. Я только последнюю глянул — там ложь будет. Печаль…
(69) ждем более качественный материал от Вас теперь)))
Женский вариант: «Корову бы ей, а лучше две» (с)
Мужской вариант: «Когда коту нечего делать, он …» (с)
Надо было выложить обработку с этими задачами, а то если честно проверять результат лень 🙂 надо открывать конфигуратор пилить обработку.
(72) для ленивых уже сделали отдельную публикацию))) Спасибо коллеге)