Я хочу предложить несколько интересных на мой взгляд задач. Скорее всего, не все они имеют практическое применение, но, я надеюсь, позволят взглянуть на казалось бы хорошо знакомые вещи с неожиданной стороны.
1)
Начнем с классики:
Как поменять местами значения двух переменных, не используя третью? В языке 1С существует как минимум три способа для числовых переменных и один - для строковых. Каждый способ имеет свои достоинства, недостатки и область применения. (Конечно же, говоря о количестве переменных, мы имеем в виду прикладной код. Какие переменные используются при этом в платформе нам неведомо). Найдите эти способы. А может быть их число гораздо больше?
2)
Имеется две таблицы, в первой - M записей, во второй - N записей. Какое максимальное и минимальное число записей может содержать результат а) левого соединения, б) внутреннего соединения и в) полного соединения таблиц? (дополнительные условия ГДЕ (WHERE) не накладываются).
3)
Существует рекомендация для оптимизации запросов: отборы при использовании виртуальных таблиц лучше задавать в параметрах виртуальной таблицы, а не в секции ГДЕ. Но всегда ли результаты будут идентичны? Другими словами: возможна ли ситуация, когда переместив условие из секции ГДЕ в параметры виртуальной таблицы, мы получим другой результат запроса?
4)
Есть справочник Контрагенты с табличной частью Скидки. Для каждого контрагента может быть несколько видов скидок, заданных в процентах.
При вычислении итоговой цены для контрагента все скидки применяются последовательно, т.е. например, если есть две скидки по 50%, то результирующая цена сторублевого товара будет: 100 минус 50% от 100 рублей и минус 50% от результата, итого - 25 руб. Таким образом итоговая скидка составила 75%.
Необходимо разработать отчет, который рассчитывает итоговые скидки контрагентов
5)
Программист Вася (не тот, который кот (c), а тот, который не кот) получил задачу:
Имеется две таблицы значений с колонкой "Наименование". Необходимо найти сколько строк (наименований) из первой таблицы присутствуют во второй. Вася решает сделать это за один проход по предварительно отсортированным таблицам и пишет вот такой код:
ТЗ1.Сортировать("Наименование");
ТЗ2.Сортировать("Наименование");
КолВоСовпадений = 0;
Индекс1 = 0;
Индекс2 = 0;
Пока Индекс1 < ТЗ1.Количество() И Индекс2 < ТЗ2.Количество() Цикл
Если ТЗ1[Индекс1].Наименование = ТЗ2[Индекс2].Наименование Тогда
КолВоСовпадений = КолВоСовпадений + 1;
Индекс1 = Индекс1 + 1;
ИначеЕсли ТЗ1[Индекс1].Наименование < ТЗ2[Индекс2].Наименование Тогда
Индекс1 = Индекс1 + 1;
ИначеЕсли ТЗ1[Индекс1].Наименование > ТЗ2[Индекс2].Наименование Тогда
Индекс2 = Индекс2 + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Количество совпадений: " + КолВоСовпадений);
К сожалению, этот код ошибочен. Где ошибка? Как исправить?
6)
Дано не очень большое положительное целое число. Необходимо разделить его на N целых частей пропорционально (точнее примерно пропорционально) N весам.
Примеры:
Число: 100
частей: 2
веса: 1, 3.
Результат: 25, 75
Число: 1000
частей: 3
веса: 1, 2, 3.
Результат: 167, 333, 500
Обязательное условие: операции умножения и деления использовать нельзя!
На этом пока все. Поздравляю всех с Новым годом!
PS: Настоятельная просьба: пожалуйста, не пишите ответы и решения в комментариях, не лишайте сообщество удовольствия самостоятельного поиска решения! Желающие могут прислать свои варианты ответов в личку, постараюсь ответить всем.
UPD 16.01.2020: