30 задач. Странных и не очень
Разработка - Математика и алгоритмы
Цель статьи
Вы когда-нибудь проходили собеседование, на котором дают разного рода задачи с проверкой
результата? Простой код, результат которого нужно объяснить. Мое мнение таково, что подобные задачи вряд ли могут дать полную картину о компетенциях разработчика, поэтому собеседование лучше проводить другими путями.
Но, подобные задачки могут быть интересными головоломками и в какой-то мере показать ту боль, что прошел разработчик за годы работы с платформой. А там, где может быть что-то интересное, почему бы не поразбираться.
В одной из предыдущих статей "Баг или фича? Неожиданное поведение платформы" мы коснулись нескольких особенностей в поведении платформы 1С. Баги это или фичи, трудно сказать. Решать это Вам. Сегодня мы рассмотрим 30 простых фрагментов кода, а Вам нужно будет сказать какой результат выполнения будет для каждой из них.
Нет, это не проверка Ваших знаний, компетенций, навыков и целеустремленности. Цель публикации - сбор интересных и не очень задач, над которыми было бы интересно посидеть, проверить на сколько предсказуемо работает платформа 1С с Вашей точки зрения. Можно, конечно, эти задачи показывать и на собеседовании, но лучше обсудите с кандидатом предыдущий опыт работы. Так будет намного содержательней.
А все что ниже - это больше для веселья!
Среда выполнения
Весь продемонстрированный далее код выполнялся на платформе 1С версии 8.3.13.1690 в клиент-серв
ерном варианте работы, управляемые формы. Никаких особых настроек не выполнялось. Обычно код задачи делится на клиентский и серверный. Можете вставить фрагмент в управляемую форму и разбить процедуры и функции по контексту выполнения с помощью директив "&НаКлиенте" и "&НаСервере".
Думаю, что поведение кода в задачах будет одинаковым как для файловой, так и для клиент-серверной базы, поэтому если сервера у Вас под рукой нет, то это не повод не попробовать эти задачи решить. Плюс ко всему, сама версия платформы не должна стать причиной разного поведения, даже если у Вас старая добрая версия 8.3.5! В последнем случае только некоторые из задач не могут быть решены (там где работа с потоками, например).
В общем, ничего особенного. Просто берете и делаете :)
Задачи
Хватит болтать, пора действовать!
Сложность задач не зависит от раздела и номера, все перемешано. Сделано это специально, чтобы у Вас не было ожиданий сложности. Так ведь интересней!
Рекомендую сначала прорешать задачу без конфигуратора с кратким объяснением своему решению, а после уже проверить себя, отдав код на выполнение платформе 1С. Выкладывать результаты для всех или нет - дело только Ваше. Но, думаю, что было бы интересно поднять обсуждение.
Первая порция задач.
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача1(Команда)
РезультатАлгоритма = Задача1НаСервере();
Сообщить(РезультатАлгоритма);
КонецПроцедуры
&НаСервере
Функция Задача1НаСервере()
Возврат ((Новый Структура) = (Новый Структура));
КонецФункции
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача2(Команда)
РезультатАлгоритма = Задача2НаСервере();
Сообщить(РезультатАлгоритма);
КонецПроцедуры
&НаСервере
Функция Задача2НаСервере()
Возврат ((Новый Массив(0)) = (Новый Массив(0)));
КонецФункции
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача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(Команда)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 1);
Задача6НаСервере(СтруктураДанных);
Сообщить(СтруктураДанных.Значение);
КонецПроцедуры
&НаСервере
Процедура Задача6НаСервере(СтруктураДанных)
СтруктураДанных.Значение = 100;
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача7(Команда)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 1);
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
Задача7НаСервере(ФиксированнаяСтруктураДанных.Значение);
Сообщить(СтруктураДанных.Значение);
КонецПроцедуры
&НаСервере
Процедура Задача7НаСервере(ПереданноеЗначение)
ПереданноеЗначение = 123456;
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача8(Команда)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 1);
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
Задача8НаСервере(ФиксированнаяСтруктураДанных);
Сообщить(ФиксированнаяСтруктураДанных.Значение);
КонецПроцедуры
&НаСервере
Процедура Задача8НаСервере(ФиксированнаяСтруктураДанных)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 123);
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача9(Команда)
Задача9НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача9НаСервере()
ТекущаяДатаНаСервере = ТекущаяДатаСеанса();
ИзмененнаяДатаНаСервере = ТекущаяДатаНаСервере + 0.001;
ДатыРавны = (ТекущаяДатаНаСервере = ИзмененнаяДатаНаСервере);
Сообщить(ДатыРавны);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача10(Команда)
Задача10НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача10НаСервере()
ТекущаяДатаНаСервере = ТекущаяДатаСеанса();
ИзмененнаяДатаНаСервере = ТекущаяДатаНаСервере + 0.001;
ДатыРавны = (Строка(ТекущаяДатаНаСервере) = Строка(ИзмененнаяДатаНаСервере));
Сообщить(ДатыРавны);
КонецПроцедуры
На этом первая порция задач закончена. Выпейте крепкого чая и продолжим.
Вторая порция задач.
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача11(Команда)
Задача11НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача11НаСервере()
НачатьТранзакцию();
Попытка
ХранилищеОбщихНастроек.Сохранить("МоеЗначение", "МойКлюч", Неопределено);
ВызватьИсключение "Ты не пройдешь!";
ЗафиксироватьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПопытки;
ЗначениеИзХранилища = ХранилищеОбщихНастроек.Загрузить("МоеЗначение", "МойКлюч");
Сообщить(ЗначениеИзХранилища);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача12(Команда)
Задача12НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача12НаСервере()
ПроверочноеЗначение = Неопределено;
НачатьТранзакцию();
Попытка
ХранилищеОбщихНастроек.Сохранить("МоеЗначение", "МойКлюч", Неопределено);
ВызватьИсключение "Ты не пройдешь!";
ЗафиксироватьТранзакцию();
Исключение
ХранилищеОбщихНастроек.Сохранить("МоеЗначениеПроверочное", "МойКлючПроверочное", 110011);
ПроверочноеЗначение = ХранилищеОбщихНастроек.Загрузить("МоеЗначениеПроверочное", "МойКлючПроверочное");
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПопытки;
ЗначениеИзХранилища = ХранилищеОбщихНастроек.Загрузить("МоеЗначение", "МойКлюч");
Сообщить(ПроверочноеЗначение);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача13(Команда)
Задача13НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача13НаСервере()
ЧислоПроверка = 0.000102410434234235348573456378465353465;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| &ЧислоПроверка КАК ЧислоПроверка
|ПОМЕСТИТЬ ВТ
|;
|
|ВЫБРАТЬ
| ВТ.ЧислоПроверка КАК ЧислоПроверка
|ИЗ
| ВТ КАК ВТ";
Запрос.УстановитьПараметр("ЧислоПроверка", ЧислоПроверка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЧислаРавны = Выборка.ЧислоПроверка = ЧислоПроверка;
Сообщить("ЧислаРавны: " + ЧислаРавны);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача14(Команда)
Задача14НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача14НаСервере()
СтрокиРавны = ("Привет" = "ПРИВЕТ");
Сообщить(СтрокиРавны);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача15(Команда)
Задача15НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача15НаСервере()
СтрокиРавны = ("Привeт" = "Привет");
Сообщить(СтрокиРавны);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача16(Команда)
Задача16НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача16НаСервере(НомерВызова = 0)
НомерВызова = НомерВызова + 1;
Сообщить(НомерВызова);
Задача16НаСервере(НомерВызова)
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача17(Команда)
Задача17НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача17НаСервере()
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("ЗначениеПоиска");
ТаблицаДанных.Колонки.Добавить("Значение");
Запись = ТаблицаДанных.Добавить();
Запись.ЗначениеПоиска = "ЗначениеR39;поиска";
Запись.Значение = 100;
НайденноеЗначение = 0;
ПоискЗаписи = ТаблицаДанных.НайтиСтроки(Новый Структура("ЗначениеПоиска", "Значение поиска"));
Если ПоискЗаписи.Количество() > 0 Тогда
НайденноеЗначение = ПоискЗаписи.Получить(0).Значение;
Иначе
НайденноеЗначение = 0;
КонецЕсли;
Сообщить(НайденноеЗначение);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача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НаСервере()
ТаблицаДляЗапроса = Новый ТаблицаЗначений;
ТаблицаДляЗапроса.Колонки.Добавить("ЗначениеСтрока", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(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(Команда)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Значение", 1);
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
Задача24НаСервере(ФиксированнаяСтруктураДанных.Значение);
Сообщить(СтруктураДанных.Значение);
КонецПроцедуры
&НаСервере
Процедура Задача24НаСервере(Знач ПереданноеЗначение)
ПереданноеЗначение = 123456;
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача25(Команда)
МассивЗначений = Новый Массив;
МассивЗначений.Добавить(1000);
МассивЗначений.Добавить(Новый Структура("Значение", 2000));
МассивЗначений.Добавить(Дата(2019, 11, 11));
Задача25НаСервере(МассивЗначений, МассивЗначений);
РезультатВычислений = МассивЗначений.Получить(0)
+ МассивЗначений.Получить(1).Значение
+ Год(МассивЗначений.Получить(2));
Сообщить(РезультатВычислений);
КонецПроцедуры
&НаСервере
Процедура Задача25НаСервере(Знач МассивЗначений1, МассивЗначений2)
МассивЗначений1.Установить(0, 10000);
МассивЗначений1.Получить(1).Значение = 20000;
МассивЗначений1.Установить(2, Дата(2020,11,11));
МассивЗначений2.Установить(0, 10000);
МассивЗначений2.Получить(1).Значение = 20000;
МассивЗначений2.Установить(2, Дата(2020,11,11));
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача26(Команда)
Задача26НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача26НаСервере()
ДатыРавны = (ТекущаяДата() = ТекущаяДатаСеанса());
Сообщить(ДатыРавны);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача27(Команда)
Задача27НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача27НаСервере()
РезультатВычислений = 0;
Для Сч = 1 По 10 Цикл
Остаток = Сч % 2;
Если Остаток > 0 Тогда
РезультатВычислений = РезультатВычислений + Сч;
КонецЕсли;
КонецЦикла;
Сообщить(РезультатВычислений);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача28(Команда)
Задача28НаСервере();
КонецПроцедуры
&НаСервере
Процедура Задача28НаСервере()
ПустойGUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
GUIDЗаполнен = ЗначениеЗаполнено(ПустойGUID);
Сообщить(GUIDЗаполнен);
КонецПроцедуры
Что выведет этот код? И выполнится ли?
&НаКлиенте
Процедура Задача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С-разработчика в крупную IT-компанию
- Программисты: красный, желтый, зеленый... Определи свой цвет!
Авторские разработки
-
Анализ производительности APDEX - отчет для просмотра и анализа замеров производительности в конфигурациях на базе БСП.
-
Путеводитель по истории релизов - отчет по истории выпуска релизов продуктов фирмы "1С" и анализа информации по обновлениям.
-
Просмотр и анализ структуры базы данных (отчет на СКД) - отчет для просмотра и анализа структуры базы данных с поддержкой файловых баз (ограниченный режим), а также баз на SQL Server и PostgreSQL.
-
Просмотр и анализ журнала регистрации (отчет на СКД) - отчет на базе системы компоновки данных (СКД) для просмотра записей журнала регистрации.
-
Обозреватель криптографии - отчет для просмотра доступных провайдеров и сертификатов криптографии на сервере и клиенте.
-
Пакетная выгрузка / загрузка внешних отчетов и обработок - пакетная выгрузка / загрузка внешних отчетов и обработок для массовый манипуляций с ними.
-
Командный интерпретатор для 1С - инструмент для выполнения команд CMD / PowerShell из 1С.
Вступайте в нашу телеграмм-группу Инфостарт
программирование задачи проверка тестирование знания практика загадки головоломки баг фича
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45731 TitanLuchs 109
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46900 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26509 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40518 bayselonarrend 24
Перенос данных 1C Администрирование СУБД Механизмы платформы 1С Системный администратор Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?
11.03.2024 47085 dsdred 82
Перенос данных 1C Механизмы платформы 1С Системный администратор Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?
11.12.2023 29746 dsdred 63
Механизмы платформы 1С Разработчик Бесплатно (free)
Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?».
06.10.2023 36419 SeiOkami 48
WEB-интеграция Универсальные функции Механизмы платформы 1С Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.
28.08.2023 32156 YA_418728146 8
Думаю, нет смысла давать ответы на задачи, которые легко проверить в конфигураторе.Как это нету? Я готов заплатить старманю, просто чтобы не тратить время на проверку своих ожиданий.
Самому проверять лениво :)
Мои ответы (СПОЙЛЕР!) |
|---|
| Вот такие ответы получились у меня.
Первая порция задач: 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. |
А так все супер)
Небольшой комментарий |
|---|
| 4. Все так. Ну а выведется "Сравение 1", "Сравнение 2", "Сравнение 3".
5. Все так. Ну а выведется "Сравнение 1" и все. 16. Верно. Будет ошибка переполнения стэка, при этом платформа выведет множество сообщений, сколько успеет. 18. Тут ошибка неявная при передаче странных символов с клиента на сервер в сообщении. |
Это можно объяснить техническими особенностями платформы.
Запрос к таблице значений - это такие действия платформы:
1. Создание временной таблицы
2. Загрузка данных в эту таблицу множеством запросов INSERT (в новых версиях платформы вроде бы поведение изменилось).
3. Пользуемся.
Но делать на этом этапе соединения с другими таблицами было бы неправильно или создало бы другие сложности.
Думаю, поэтому разработчики 1С и ввели эти ограничения.
Возврат ((Новый Структура) = (Новый Структура));Выскажу свое мнение по задаче №1.
НЕ проверял на платформе.
Только свое мнение. Обсуждение приветствуется.
Команда Новый Структура - по идее создает новый объект с типом "Структура", при этом в памяти резервируется ячейка памяти (адрес) под этот объект...
Поэтому в итоге мы сравниваем два объекта с разной адресацией в памяти. Значит на выходе сравнение должно дать или ошибку или Ложь - так как объекты разные. Ошибку может дать в связи с тем, что мы не знаем что заложено в платформу при сравнении подобных объектов.
Возможно при сравнении подобных объектов вызывается исключение, и в результате появляется ошибка.
Не знаю как это "по-научному" объяснить)
Там не все так просто:
&НаКлиенте
Процедура ПередачаПоСсылкеКлиент(Параметр)
Список= Новый СписокЗначений;
Список.Добавить("привет");
Список.Добавить("привет");
Параметр = Список;
КонецПроцедуры
&НаКлиенте
Процедура ПередачаПоЗначениюКлиент1(Знач Параметр)
Список= Новый СписокЗначений;
Список.Добавить("привет");
Список.Добавить("привет");
Параметр = Список;
КонецПроцедуры
&НаКлиенте
Процедура ПередачаПоЗначениюКлиент2(Знач Параметр)
Параметр.Добавить("привет");
КонецПроцедуры
&НаСервере
Процедура ПередачаПоСсылкеСервер(Параметр)
Параметр.Добавить("привет");
КонецПроцедуры
&НаСервере
Процедура ПередачаПоЗначениюСервер(Знач Параметр)
Параметр.Добавить("привет");
КонецПроцедуры
&НаКлиенте
Процедура ПередачаПараметровКлиентСервер()
Список1= Новый СписокЗначений;
Список1.Добавить("привет");
Список2 = Список1.Скопировать();
Список3 = Список1.Скопировать();
Список4 = Список1.Скопировать();
Список5 = Список1.Скопировать();
ПередачаПоСсылкеКлиент(Список1);
ПередачаПоЗначениюКлиент1(Список2);
ПередачаПоЗначениюКлиент2(Список3);
ПередачаПоСсылкеСервер(Список4);
ПередачаПоЗначениюСервер(Список5);
Сообщить(Список1.Количество());
Сообщить(Список2.Количество());
Сообщить(Список3.Количество());
Сообщить(Список4.Количество());
Сообщить(Список5.Количество());
КонецПроцедуры ПоказатьУ кого какие варианты?
Все таки промахнулся)))
Мой ответ |
|---|
| Мой ответ был:
2, 1, 2, 1, 1 |
Ошибся в методе "ПередачаПоСсылкеСервер", почему-то решил что в итоге список не изменится :) Явная ошибка)))
Правильный ответ |
|---|
| 2, 1, 2, 2, 1 |
Список1 - 2 (инициализировали переданный в процедуру список новым с двумя значениями)
Список2 - 1 (инициализировали параметр, оригинал остался с одним значением)
Список3 - 2 (добавили в список элемент по переданной ссылке)
Список4 - 2 (список скопировался на сервер, там ему добавили элемент, затем список вернулся обратно)
Список5 - 1 (аналогично предыдущему пункту, только сам список не возвращается на клиент)
За по последнему пункту спасибо Андрею Овсянкину.
Небольшое дополнение:
Список1 - передаем ссылку на объект. В процедуре присваиваем ссылке ссылку на новый объект. В точке вызова имеем новую ссылку и новый объект.
Список2 - передаем копию ссылки, объект остается один. Присваиваем копии ссылки ссылку на новый объект. Ссылка в точке вызова и изначальный объект остаются без изменения.
Список3 - передаем копию ссылки, объект остается один. Меняем по копии ссылки сам объект. В точке вызова ссылка та же, объект изменен.
Необходимо было передавать большие файлы(видео) с сервера на клиент. Когда одной командой получаешь из временного хранилища, то всё замирает и никак не реагирует. Уже собирался резать файл на кусочки двоичных данных с помощью потоков и раскладывать по временным хранилищам и на клиент отправлять массив адресов хранилищ.
Но обошлись предупреждающей табличкой :)
ХранилищеОбщихНастроек.Сохранить("МоеЗначение", "МойКлюч", Неопределено);
Плохой пример. В результате получается Неопределено . И неясно, это мы достали Неопределено из хранилища, или там просто ничего нет. Хороший пример :
ХранилищеОбщихНастроек.Сохранить("МоеЗначение", "МойКлюч", 1);
&НаКлиенте
Процедура Команда1(Команда)
стр = "Завтрак";
Задача31НаСервере(стр, стр, стр);
Сообщить(стр);
КонецПроцедуры
&НаСервере
Процедура Задача31НаСервере(Парам1, Парам2, Парам3)
Парам1 = "Обед";
Парам2 = "Ужин";
КонецПроцедуры
ПоказатьТЗ = Новый ТаблицаЗначений;
ТЗ .Колонки.Добавить("Колонка1");
Стр = ТЗ.Добавить();
Стр.Колонка1 = "100";
Стр = ТЗ.Добавить();
Стр.Колонка1 = "200";
Для каждого стр из ТЗ Цикл
Сообщить(Стр.Колонка1);
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Колонка2");
Стр = ТЗ.Добавить();
Стр.Колонка2 = "ААА";
Стр = ТЗ.Добавить();
Стр.Колонка2 = "БББ";
КонецЦикла; ПоказатьСначала, подумал:
"Ошибку, низзя строке присвоить значение: Стр = ТЗ.Добавить(); "
Потом, понял, без прямой проверки, однозначного ответа - нет. Если стр интерпретировать по разному, то вообще возможно бесконечное количество вариантов:
Какая область видимости "стр"?
Осуществляет ли "подъем" перменных компилятор/интерпретатор (или ХЕЗ, как его теперь называть)
и т.п. ...
Т.е. - проще, проверить "на практике", и это, кстати, не гарантирует, что от версии платформы к платформе поведение не будет меняться, такие ситуации проще исключать из практики
Этот код не выполнится, потому что есть ошибка в сравнении структур. В языке 1С оператор сравнения = используется для сравнения значений, но в данном случае вы сравниваете два новых объекта типа Структура, что всегда будет возвращать Ложь, поскольку это разные экземпляры объектов, даже если они пустые.
Правильный способ сравнить две структуры в 1С — использовать метод Сравнить. Однако, для вашего примера, если целью является возвращение логического значения, которое показывает, что две пустые структуры равны, можно просто вернуть Истина.
Вот исправленный вариант вашего кода:
&НаКлиенте
Процедура Задача1(Команда)
РезультатАлгоритма = Задача1НаСервере();
Сообщить(РезультатАлгоритма);
КонецПроцедуры
&НаСервере
Функция Задача1НаСервере()
Возврат (Сравнить(Новый Структура, Новый Структура));
КонецФункции ПоказатьЭтот код выполнится и выведет Истина, так как два пустых объекта Структура действительно равны.
Проверил в конфигураторе - Ложь, а в пользовательском режиме выходит нет, зато то, что навыдумывал ИИ Chat GPT 4 уже в конфигураторе дал ошибку:
Возврат (<<?>>Сравнить(Новый Структура, Новый Структура)); (Проверка: Сервер)
&НаКлиенте
Процедура Задача3(Команда)
РезультатАлгоритма = Задача3НаСервере();
Сообщить(РезультатАлгоритма);
КонецПроцедуры
&НаКлиенте
Функция Задача3НаСервере()
Возврат (Null = Неопределено);
КонецФункции ПоказатьПодскажите, как сделать, чтобы работало с сервером?
Программа не работает изначально. Я выше поясняю, что если директиву меняю с &НаСервере на &НаКлиенте, то все работает. Программа компилируется. Что нужно сделать, чтобы с директивой &НаСервере работало? Вы прочли мой комментарий полностью ?
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1161686
Создание 02.12.19 07:55
Обновление 02.12.19 07:55
Просмотры 74206
Загрузки 0
Рейтинг
167
Комментарии 70
Код открыт Да
Рубрики Математика и алгоритмы Механизмы платформы 1С
Кому
Разработчик
,
Стажер
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)