Загрузка данных



&НаСервере
Процедура СоздатьИгровоеПоле()
    ДополнительныеРеквизиты = Новый Массив;
    Для НомерЯчейки = 1 По 81 Цикл
        ИмяРеквизита = "Ячейка" + Строка(НомерЯчейки);
        НовыйРеквизит = Новый РеквизитФормы(
            ИмяРеквизита,
            Новый ОписаниеТипов("Число"));
        ДополнительныеРеквизиты.Добавить(НовыйРеквизит);
    КонецЦикла;
    ИзменитьРеквизиты(ДополнительныеРеквизиты);
    ГруппаПоля = Элементы.Добавить(
        "ИгровоеПоле",
        Тип("ГруппаФормы"));
    ГруппаПоля.Вид = ВидГруппыФормы.ОбычнаяГруппа;
    ГруппаПоля.Группировка =
        ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
    Для НомерСтроки = 1 По 9 Цикл
        ГруппаСтроки = Элементы.Добавить(
            "Строка" + Строка(НомерСтроки),
            Тип("ГруппаФормы"),
            ГруппаПоля);
        ГруппаСтроки.Вид = ВидГруппыФормы.ОбычнаяГруппа;
        ГруппаСтроки.Группировка =
            ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
        Для НомерСтолбца = 1 По 9 Цикл
            НомерЯчейки =
                (НомерСтроки - 1) * 9 + НомерСтолбца;
            ИмяЭлемента = "Поле" + Строка(НомерЯчейки);
            ИмяРеквизита = "Ячейка" + Строка(НомерЯчейки);
            ПолеВвода = Элементы.Добавить(
                ИмяЭлемента,
                Тип("ПолеФормы"),
                ГруппаСтроки);
            ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
            ПолеВвода.ПутьКДанным = ИмяРеквизита;
            ПолеВвода.Заголовок = "";
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры





&НаКлиенте
Процедура НачатьИгру(Команда)

    ОчиститьПолеНаСервере();

    ПодключитьОбработчикОжидания(
        "АвтоматическиСохранитьИгру",
        60,
        Истина);

    Сообщить("Новая игра началась!");

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



&НаКлиенте
Процедура ОчиститьПоле(Команда)

    ОчиститьПолеНаСервере();

    Сообщить("Игровое поле очищено.");

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


&НаСервере
Процедура ОчиститьПолеНаСервере()

    Для НомерЯчейки = 1 По 81 Цикл

        ИмяРеквизита = "Ячейка" + Строка(НомерЯчейки);

        ЭтаФорма[ИмяРеквизита] = 0;

    КонецЦикла;

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




&НаСервере
Функция ЧислоДопустимо(НомерСтроки, НомерСтолбца, ЧислоДляПроверки)

    Если ЧислоДляПроверки < 1
        Или ЧислоДляПроверки > 9 Тогда

        Возврат Ложь;

    КонецЕсли;

    Для Столбец = 1 По 9 Цикл

        Если Столбец <> НомерСтолбца Тогда

            НомерЯчейки =
                (НомерСтроки - 1) * 9 + Столбец;

            ЗначениеЯчейки =
                ЭтаФорма["Ячейка" + Строка(НомерЯчейки)];

            Если ЗначениеЯчейки = ЧислоДляПроверки Тогда

                Возврат Ложь;

            КонецЕсли;

        КонецЕсли;

    КонецЦикла;

    Для Строка = 1 По 9 Цикл

        Если Строка <> НомерСтроки Тогда

            НомерЯчейки =
                (Строка - 1) * 9 + НомерСтолбца;

            ЗначениеЯчейки =
                ЭтаФорма["Ячейка" + Строка(НомерЯчейки)];

            Если ЗначениеЯчейки = ЧислоДляПроверки Тогда

                Возврат Ложь;

            КонецЕсли;

        КонецЕсли;

    КонецЦикла;

    НачалоСтрокиКвадрата =
        Цел((НомерСтроки - 1) / 3) * 3 + 1;

    НачалоСтолбцаКвадрата =
        Цел((НомерСтолбца - 1) / 3) * 3 + 1;

    Для СмещениеСтроки = 0 По 2 Цикл

        Для СмещениеСтолбца = 0 По 2 Цикл

            СтрокаКвадрата =
                НачалоСтрокиКвадрата + СмещениеСтроки;

            СтолбецКвадрата =
                НачалоСтолбцаКвадрата + СмещениеСтолбца;

            Если СтрокаКвадрата = НомерСтроки
                И СтолбецКвадрата = НомерСтолбца Тогда

                Продолжить;

            КонецЕсли;

            НомерЯчейки =
                (СтрокаКвадрата - 1) * 9
                + СтолбецКвадрата;

            ЗначениеЯчейки =
                ЭтаФорма["Ячейка" + Строка(НомерЯчейки)];

            Если ЗначениеЯчейки = ЧислоДляПроверки Тогда

                Возврат Ложь;

            КонецЕсли;

        КонецЦикла;

    КонецЦикла;

    Возврат Истина;

КонецФункции



&НаКлиенте
Процедура НеЗнаю(Команда)

    Элемент = ЭтаФорма.ТекущийЭлемент;

    Если Элемент = Неопределено Тогда

        Сообщить("Сначала выберите ячейку.");
        Возврат;

    КонецЕсли;

    Если Лев(Элемент.ПутьКДанным, 6) <> "Ячейка" Тогда

        Сообщить("Выберите ячейку игрового поля.");
        Возврат;

    КонецЕсли;

    ИмяРеквизита = Элемент.ПутьКДанным;

    НомерЯчейки = Число(
        Сред(ИмяРеквизита, 7));

    НомерСтроки = Цел((НомерЯчейки - 1) / 9) + 1;

    НомерСтолбца =
        НомерЯчейки - (НомерСтроки - 1) * 9;

    Если ЭтаФорма[ИмяРеквизита] <> 0 Тогда

        Сообщить("Ячейка уже заполнена.");
        Возврат;

    КонецЕсли;

    ВозможныеЧисла = "";

    Для ЧислоДляПроверки = 1 По 9 Цикл

        Если ЧислоДопустимо(
            НомерСтроки,
            НомерСтолбца,
            ЧислоДляПроверки) Тогда

            Если ВозможныеЧисла <> "" Тогда

                ВозможныеЧисла =
                    ВозможныеЧисла + ", ";

            КонецЕсли;

            ВозможныеЧисла =
                ВозможныеЧисла
                + Строка(ЧислоДляПроверки);

        КонецЕсли;

    КонецЦикла;

    Если ВозможныеЧисла = "" Тогда

        Сообщить("Нет допустимых чисел для этой ячейки.");

    Иначе

        Сообщить(
            "Возможные числа: " + ВозможныеЧисла);

    КонецЕсли;

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


&НаКлиенте
Процедура СохранитьИгру(Команда)

    СохранитьИгруНаСервере();

    Сообщить("Игра сохранена.");

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


&НаСервере
Процедура СохранитьИгруНаСервере()
    ДанныеИгры = Новый Массив;
    Для НомерЯчейки = 1 По 81 Цикл
        ИмяРеквизита = "Ячейка" + Строка(НомерЯчейки);
        ДанныеИгры.Добавить(ЭтаФорма[ИмяРеквизита]);
    КонецЦикла;
    ХранилищеИгры = Новый ХранилищеЗначения(ДанныеИгры);
    // Ищем существующую запись.
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |   Результаты.Ключ КАК Ключ
        |ИЗ
        |   РегистрСведений.Результаты КАК Результаты
        |ГДЕ
        |   Результаты.Ключ = &Ключ";
    Запрос.УстановитьПараметр("Ключ", "Судоку");
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        // Обновляем существующую запись.
        НаборЗаписей = РегистрыСведений.Результаты.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Ключ.Установить("Судоку");
        НаборЗаписей.Прочитать();
        Для Каждого Запись Из НаборЗаписей Цикл
            Запись.Игра = ХранилищеИгры;
        КонецЦикла;
        НаборЗаписей.Записать();
    Иначе
        // Создаем новую запись, если ее еще нет.
        ЗаписьРегистра =
            РегистрыСведений.Результаты.СоздатьМенеджерЗаписи();
        ЗаписьРегистра.Ключ = "Судоку";
        ЗаписьРегистра.Игра = ХранилищеИгры;
        ЗаписьРегистра.Записать();
    КонецЕсли;
КонецПроцедуры



&НаКлиенте
Процедура ВосстановитьИгру(Команда)

    ВосстановитьИгруНаСервере();

    Сообщить("Восстановление игры завершено.");

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


&НаСервере
Процедура ВосстановитьИгруНаСервере()

    ЗаписьРегистра =
        РегистрыСведений.Результаты.СоздатьМенеджерЗаписи();

    ЗаписьРегистра.Ключ = "Судоку";
    ЗаписьРегистра.Прочитать();

    Если Не ЗаписьРегистра.Выбран() Тогда

        Сообщить("Сохранённая игра не найдена.");
        Возврат;

    КонецЕсли;

    ДанныеИгры = ЗаписьРегистра.Игра.Получить();

    Если ДанныеИгры = Неопределено Тогда

        Сообщить("Сохранение пустое.");
        Возврат;

    КонецЕсли;

    Если ДанныеИгры.Количество() <> 81 Тогда

        Сообщить("Сохранённые данные повреждены.");
        Возврат;

    КонецЕсли;

    Для НомерЯчейки = 1 По 81 Цикл

        ИмяРеквизита =
            "Ячейка" + Строка(НомерЯчейки);

        ЭтаФорма[ИмяРеквизита] =
            ДанныеИгры[НомерЯчейки - 1];

    КонецЦикла;

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




&НаКлиенте
Процедура АвтоматическиСохранитьИгру()

    СохранитьИгруНаСервере();

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